diff --git a/DEPS b/DEPS
index f213c00..bbaed0e 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': 'e782f8472f61a5a553c57fef788ad4405844887b',
+  'skia_revision': 'c1de8bd2ba3b90faea4e6c9f84f753f3e64c3f76',
   # 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': '8b8cc1cca5b1235993acb504f1e0373e47e14cad',
+  'v8_revision': 'c5287309035c2a995d3d7e24c49622aa76c711b1',
   # 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': '2eb65034db7115f7cce46e119a6ac0c99f8d1584',
+  'angle_revision': 'ac43aaa2c2e192e38c8d4118ec7deb3e1842e2c4',
   # 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.
@@ -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': '100f0ee2ceb7b787e4743d9ec8154210bc047bc4',
+  'catapult_revision': '5c2d9e757a6f8966612c6be9bb21f6344be00bd8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -229,7 +229,7 @@
 
 deps = {
   'src/chrome/browser/resources/media_router/extension/src':
-    Var('chromium_git') + '/media_router.git' + '@' + '9f9f41bdd831c0bd84eea252634ee52f769e9977',
+    Var('chromium_git') + '/media_router.git' + '@' + '475baa8b2eb0a7a9dd1c96c9c7a6a8d9035cc8d7',
 
   'src/buildtools':
     Var('chromium_git') + '/chromium/buildtools.git' + '@' +  Var('buildtools_revision'),
@@ -564,7 +564,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1aefad2a598268530e01aff1d32ef71fe1555617',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6f812e132d25df1b561f7182b04903004a3055e4',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1034,7 +1034,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '21dbf06b5aa6c7dc8cf56314d4a3f96f57956c53',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '45a4c41eda9066a62e7e324b008a35c0295f15c7',
+    Var('webrtc_git') + '/src.git' + '@' + '1a9c0285068617a0b57e09efaceee823bbcd7dba',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/ash/accelerators/accelerator_controller.h b/ash/accelerators/accelerator_controller.h
index cc7d4cc..b09dfda 100644
--- a/ash/accelerators/accelerator_controller.h
+++ b/ash/accelerators/accelerator_controller.h
@@ -45,6 +45,7 @@
 class ASH_EXPORT AcceleratorController : public ui::AcceleratorTarget,
                                          public mojom::AcceleratorController {
  public:
+  // TODO(jamescook): Remove |manager_delegate|. https://crbug.com/842365
   explicit AcceleratorController(
       ui::AcceleratorManagerDelegate* manager_delegate);
   ~AcceleratorController() override;
diff --git a/ash/app_list/model/app_list_folder_item.cc b/ash/app_list/model/app_list_folder_item.cc
index b2169ac..020aac5 100644
--- a/ash/app_list/model/app_list_folder_item.cc
+++ b/ash/app_list/model/app_list_folder_item.cc
@@ -70,4 +70,8 @@
   SetIcon(folder_image_.icon());
 }
 
+void AppListFolderItem::NotifyOfDraggedItem(AppListItem* dragged_item) {
+  folder_image_.UpdateDraggedItem(dragged_item);
+}
+
 }  // namespace app_list
diff --git a/ash/app_list/model/app_list_folder_item.h b/ash/app_list/model/app_list_folder_item.h
index 1af11f99..760c504 100644
--- a/ash/app_list/model/app_list_folder_item.h
+++ b/ash/app_list/model/app_list_folder_item.h
@@ -73,6 +73,10 @@
   // FolderImageObserver overrides:
   void OnFolderImageUpdated() override;
 
+  // Informs the folder item of an item being dragged, that it may notify its
+  // image.
+  void NotifyOfDraggedItem(AppListItem* dragged_item);
+
  private:
   // The type of folder; may affect behavior of folder views.
   const FolderType folder_type_;
diff --git a/ash/app_list/model/folder_image.cc b/ash/app_list/model/folder_image.cc
index f93d596..168544e 100644
--- a/ash/app_list/model/folder_image.cc
+++ b/ash/app_list/model/folder_image.cc
@@ -163,15 +163,26 @@
     item->RemoveObserver(this);
   top_items_.clear();
 
-  for (size_t i = 0; i < std::min(kNumFolderTopItems, item_list_->item_count());
+  for (size_t i = 0;
+       i < item_list_->item_count() && top_items_.size() < kNumFolderTopItems;
        ++i) {
     AppListItem* item = item_list_->item_at(i);
+    // If this item is currently being dragged, pretend it has already left our
+    // folder
+    if (item == dragged_item_)
+      continue;
     item->AddObserver(this);
     top_items_.push_back(item);
   }
   RedrawIconAndNotify();
 }
 
+void FolderImage::UpdateDraggedItem(const AppListItem* dragged_item) {
+  DCHECK(dragged_item_ != dragged_item);
+  dragged_item_ = dragged_item;
+  UpdateIcon();
+}
+
 // static
 std::vector<gfx::Rect> FolderImage::GetTopIconsBounds(
     const gfx::Rect& folder_icon_bounds,
diff --git a/ash/app_list/model/folder_image.h b/ash/app_list/model/folder_image.h
index 5ea27d64..273774e 100644
--- a/ash/app_list/model/folder_image.h
+++ b/ash/app_list/model/folder_image.h
@@ -52,6 +52,10 @@
   // and notifies observers that the icon has changed.
   void UpdateIcon();
 
+  // Given an AppListItem currently being dragged, updates |dragged_item_| then
+  // executes an ordinary run of UpdateIcon()
+  void UpdateDraggedItem(const AppListItem* dragged_item);
+
   const gfx::ImageSkia& icon() const { return icon_; }
 
   // Calculates the top item icons' bounds inside |folder_icon_bounds|.
@@ -96,6 +100,9 @@
   // List of top-level app list items (to display small in the icon).
   AppListItemList* item_list_;
 
+  // Item being dragged, if any.
+  const AppListItem* dragged_item_ = nullptr;
+
   // Top items for generating folder icon.
   std::vector<AppListItem*> top_items_;
 
diff --git a/ash/app_list/views/app_list_folder_view.cc b/ash/app_list/views/app_list_folder_view.cc
index 95d3b36f..cbddd09 100644
--- a/ash/app_list/views/app_list_folder_view.cc
+++ b/ash/app_list/views/app_list_folder_view.cc
@@ -728,6 +728,9 @@
   gfx::Point to_root_level_grid = drag_point_in_folder_grid;
   ConvertPointToTarget(items_grid_view_, container_view_->apps_grid_view(),
                        &to_root_level_grid);
+  // Ensures the icon updates to reflect that the icon has been removed during
+  // the drag
+  folder_item_->NotifyOfDraggedItem(original_drag_view->item());
   StartSetupDragInRootLevelAppsGridView(original_drag_view, to_root_level_grid,
                                         has_native_drag);
   container_view_->ReparentFolderItemTransit(folder_item_);
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index 9518bfe..521cd2c0 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -1629,6 +1629,10 @@
   if (!drag_view_)
     return;
 
+  DCHECK(activated_folder_item_view_);
+  static_cast<AppListFolderItem*>(activated_folder_item_view_->item())
+      ->NotifyOfDraggedItem(nullptr);
+
   DCHECK(IsDraggingForReparentInRootLevelGridView());
   bool cancel_reparent = cancel_drag || drop_attempt_ == DROP_FOR_NONE;
   if (!events_forwarded_to_drag_drop_host && !cancel_reparent) {
diff --git a/ash/frame/custom_frame_view_ash_unittest.cc b/ash/frame/custom_frame_view_ash_unittest.cc
index ef9305b..d7c5f140 100644
--- a/ash/frame/custom_frame_view_ash_unittest.cc
+++ b/ash/frame/custom_frame_view_ash_unittest.cc
@@ -32,7 +32,6 @@
 #include "ui/aura/window_targeter.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/test_accelerator_target.h"
-#include "ui/compositor/test/draw_waiter_for_test.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/image/image_skia.h"
@@ -140,32 +139,6 @@
             delegate->custom_frame_view()->GetHeaderView()->height());
 }
 
-// Regression test for https://crbug.com/839955
-TEST_F(CustomFrameViewAshTest, ActiveStateOfButtonMatchesWidget) {
-  CustomFrameTestWidgetDelegate* delegate = new CustomFrameTestWidgetDelegate;
-  std::unique_ptr<views::Widget> widget = CreateTestWidget(delegate);
-  FrameCaptionButtonContainerView::TestApi test_api(
-      delegate->custom_frame_view()
-          ->GetHeaderView()
-          ->caption_button_container());
-
-  widget->Show();
-  EXPECT_TRUE(widget->IsActive());
-  // The paint state doesn't change till the next paint.
-  ui::DrawWaiterForTest::WaitForCompositingEnded(
-      widget->GetLayer()->GetCompositor());
-  EXPECT_TRUE(test_api.size_button()->paint_as_active());
-
-  // Activate a different widget so the original one loses activation.
-  std::unique_ptr<views::Widget> widget2 =
-      CreateTestWidget(new CustomFrameTestWidgetDelegate);
-  widget2->Show();
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(widget->IsActive());
-  EXPECT_FALSE(test_api.size_button()->paint_as_active());
-}
-
 // Verify that CustomFrameViewAsh returns the correct minimum and maximum frame
 // sizes when the client view does not specify any size constraints.
 TEST_F(CustomFrameViewAshTest, NoSizeConstraints) {
diff --git a/ash/host/ash_window_tree_host.cc b/ash/host/ash_window_tree_host.cc
index 052276d..916b5995a 100644
--- a/ash/host/ash_window_tree_host.cc
+++ b/ash/host/ash_window_tree_host.cc
@@ -11,7 +11,6 @@
 #include "ash/host/ash_window_tree_host_platform.h"
 #include "ash/host/ash_window_tree_host_unified.h"
 #include "ash/public/cpp/ash_switches.h"
-#include "ash/shell_port.h"
 #include "base/command_line.h"
 #include "base/sys_info.h"
 #include "ui/aura/client/screen_position_client.h"
@@ -72,11 +71,6 @@
 // static
 std::unique_ptr<AshWindowTreeHost> AshWindowTreeHost::Create(
     const AshWindowTreeHostInitParams& init_params) {
-  std::unique_ptr<AshWindowTreeHost> ash_window_tree_host =
-      ShellPort::Get()->CreateAshWindowTreeHost(init_params);
-  if (ash_window_tree_host)
-    return ash_window_tree_host;
-
   if (init_params.mirroring_unified) {
     return std::make_unique<AshWindowTreeHostMirroringUnified>(
         init_params.initial_bounds, init_params.display_id,
diff --git a/ash/public/cpp/app_list/app_list_config.cc b/ash/public/cpp/app_list/app_list_config.cc
index e38555c..cb936a0 100644
--- a/ash/public/cpp/app_list/app_list_config.cc
+++ b/ash/public/cpp/app_list/app_list_config.cc
@@ -27,6 +27,11 @@
       search_list_icon_dimension_(18),
       search_list_badge_icon_dimension_(14),
       app_title_max_line_height_(16),
+      app_title_font_(
+          ui::ResourceBundle::GetSharedInstance()
+              .GetFontList(ui::ResourceBundle::LargeFont)
+              .DeriveWithHeightUpperBound(app_title_max_line_height_)
+              .DeriveWithSizeDelta(1)),
       peeking_app_list_height_(320),
       search_box_closed_top_padding_(12),
       search_box_peeking_top_padding_(24),
@@ -60,6 +65,10 @@
     grid_focus_dimension_ = 80;
     grid_focus_corner_radius_ = 12;
     app_title_max_line_height_ = 20;
+    app_title_font_ =
+        ui::ResourceBundle::GetSharedInstance()
+            .GetFontList(ui::ResourceBundle::LargeFont)
+            .DeriveWithHeightUpperBound(app_title_max_line_height_);
     peeking_app_list_height_ = 284;
     search_box_closed_top_padding_ = 0;
     search_box_peeking_top_padding_ = 84;
@@ -79,14 +88,6 @@
     page_flip_zone_size_ = 20;
     grid_tile_spacing_in_folder_ = 8;
   }
-
-  // We're getting the largest font that doesn't exceed
-  // |app_title_max_line_height_|. Note: we resize the font to 1px larger,
-  // otherwise it looks too small.
-  app_title_font_ = ui::ResourceBundle::GetSharedInstance()
-                        .GetFontList(ui::ResourceBundle::LargeFont)
-                        .DeriveWithHeightUpperBound(app_title_max_line_height_)
-                        .DeriveWithSizeDelta(1);
 }
 
 AppListConfig::~AppListConfig() = default;
diff --git a/ash/screen_util.cc b/ash/screen_util.cc
index 6827a57..2b1d2a71 100644
--- a/ash/screen_util.cc
+++ b/ash/screen_util.cc
@@ -9,6 +9,7 @@
 #include "base/logging.h"
 #include "ui/aura/client/screen_position_client.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_tree_host.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/screen.h"
@@ -76,6 +77,40 @@
   return gfx::Rect(gfx::ToCeiledSize(size));
 }
 
+gfx::Rect SnapBoundsToDisplayEdge(const gfx::Rect& bounds,
+                                  const aura::Window* window) {
+  const aura::WindowTreeHost* host = window->GetHost();
+  if (!host)
+    return bounds;
+
+  const float dsf = host->device_scale_factor();
+  const gfx::Rect display_bounds_in_pixel = host->GetBoundsInPixels();
+  const gfx::Rect display_bounds_in_dip = window->GetRootWindow()->bounds();
+  const gfx::Rect bounds_in_pixel = gfx::ScaleToEnclosedRect(bounds, dsf);
+
+  // Adjusts |bounds| such that the scaled enclosed bounds are atleast as big as
+  // the scaled enclosing unadjusted bounds.
+  gfx::Rect snapped_bounds = bounds;
+  if ((display_bounds_in_dip.width() == bounds.width() &&
+       bounds_in_pixel.width() != display_bounds_in_pixel.width()) ||
+      (bounds.right() == display_bounds_in_dip.width() &&
+       bounds_in_pixel.right() != display_bounds_in_pixel.width())) {
+    snapped_bounds.Inset(0, 0, -1, 0);
+    DCHECK_GE(gfx::ScaleToEnclosedRect(snapped_bounds, dsf).right(),
+              gfx::ScaleToEnclosingRect(bounds, dsf).right());
+  }
+  if ((display_bounds_in_dip.height() == bounds.height() &&
+       bounds_in_pixel.height() != display_bounds_in_pixel.height()) ||
+      (bounds.bottom() == display_bounds_in_dip.height() &&
+       bounds_in_pixel.bottom() != display_bounds_in_pixel.height())) {
+    snapped_bounds.Inset(0, 0, 0, -1);
+    DCHECK_GE(gfx::ScaleToEnclosedRect(snapped_bounds, dsf).bottom(),
+              gfx::ScaleToEnclosingRect(bounds, dsf).bottom());
+  }
+
+  return snapped_bounds;
+}
+
 }  // namespace screen_util
 
 }  // namespace ash
diff --git a/ash/screen_util.h b/ash/screen_util.h
index 9c8ce825..5e79e6c 100644
--- a/ash/screen_util.h
+++ b/ash/screen_util.h
@@ -47,6 +47,15 @@
 // root windows, and only use logical display in display management code.
 ASH_EXPORT gfx::Rect GetDisplayBoundsWithShelf(aura::Window* window);
 
+// Returns an adjusted bounds for the given |bounds| by false snapping it to the
+// edge of the display in pixel space. It will snap the bounds to the display
+// that contains |window|. This will prevent any 1px gaps that you might see at
+// the edges of the display. We achieve this by increasing the height and/or the
+// width of |bounds| so that in pixel space, they cover the edge of the dispaly.
+// |bounds| should be in screen space.
+ASH_EXPORT gfx::Rect SnapBoundsToDisplayEdge(const gfx::Rect& bounds,
+                                             const aura::Window* window);
+
 }  // namespace screen_util
 
 }  // namespace ash
diff --git a/ash/screen_util_unittest.cc b/ash/screen_util_unittest.cc
index ceecb2b..4f611399 100644
--- a/ash/screen_util_unittest.cc
+++ b/ash/screen_util_unittest.cc
@@ -166,4 +166,27 @@
             screen_util::GetDisplayBoundsWithShelf(window));
 }
 
+TEST_F(ScreenUtilTest, SnapBoundsToDisplayEdge) {
+  UpdateDisplay("2400x1600*1.5");
+
+  gfx::Rect bounds(1555, 0, 45, 1066);
+  views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
+      NULL, CurrentContext(), bounds);
+  aura::Window* window = widget->GetNativeWindow();
+
+  gfx::Rect snapped_bounds =
+      screen_util::SnapBoundsToDisplayEdge(bounds, window);
+
+  EXPECT_EQ(snapped_bounds, gfx::Rect(1555, 0, 45, 1067));
+
+  bounds = gfx::Rect(5, 1000, 1595, 66);
+  snapped_bounds = screen_util::SnapBoundsToDisplayEdge(bounds, window);
+  EXPECT_EQ(snapped_bounds, gfx::Rect(5, 1000, 1595, 67));
+
+  UpdateDisplay("800x600");
+  bounds = gfx::Rect(0, 552, 800, 48);
+  snapped_bounds = screen_util::SnapBoundsToDisplayEdge(bounds, window);
+  EXPECT_EQ(snapped_bounds, gfx::Rect(0, 552, 800, 48));
+}
+
 }  // namespace ash
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index beff84d..dbe9b11 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -754,8 +754,10 @@
       gfx::Point(available_bounds.x(), bottom_shelf_vertical_offset),
       gfx::Point(available_bounds.x(), available_bounds.y()),
       gfx::Point(available_bounds.right() - shelf_width, available_bounds.y()));
-  target_bounds->shelf_bounds_in_root =
-      gfx::Rect(shelf_origin.x(), shelf_origin.y(), shelf_width, shelf_height);
+
+  target_bounds->shelf_bounds_in_root = screen_util::SnapBoundsToDisplayEdge(
+      gfx::Rect(shelf_origin.x(), shelf_origin.y(), shelf_width, shelf_height),
+      shelf_widget_->GetNativeWindow());
 
   gfx::Size status_size(
       shelf_widget_->status_area_widget()->GetWindowBoundsInScreen().size());
diff --git a/ash/shell.cc b/ash/shell.cc
index 1511796..35ceff8 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -207,6 +207,7 @@
 #include "ui/keyboard/keyboard_switches.h"
 #include "ui/keyboard/keyboard_ui.h"
 #include "ui/keyboard/keyboard_util.h"
+#include "ui/ozone/public/ozone_platform.h"
 #include "ui/views/corewm/tooltip_aura.h"
 #include "ui/views/corewm/tooltip_controller.h"
 #include "ui/views/focus/focus_manager_factory.h"
@@ -1083,7 +1084,7 @@
   cursor_manager_->SetDisplay(
       display::Screen::GetScreen()->GetPrimaryDisplay());
 
-  accelerator_controller_ = shell_port_->CreateAcceleratorController();
+  accelerator_controller_ = std::make_unique<AcceleratorController>(nullptr);
 
   // |app_list_controller_| is put after |tablet_mode_controller_| as the former
   // uses the latter in constructor.
@@ -1224,9 +1225,9 @@
   // WindowTreeHostManager::Observer::OnDisplaysInitialized().
   touch_transformer_controller_ = std::make_unique<AshTouchTransformController>(
       display_configurator_.get(), display_manager_.get(),
-      shell_port_->CreateTouchTransformDelegate());
+      std::make_unique<display::DefaultTouchTransformSetter>());
 
-  keyboard_ui_ = shell_port_->CreateKeyboardUI();
+  keyboard_ui_ = KeyboardUI::Create();
 
   // |system_tray_model_| should be available before
   // |system_notification_controller_| is initialized and Shelf is created by
@@ -1313,8 +1314,8 @@
   display_configuration_controller_ =
       std::make_unique<DisplayConfigurationController>(
           display_manager_.get(), window_tree_host_manager_.get());
-  display_configurator_->Init(shell_port_->CreateNativeDisplayDelegate(),
-                              false);
+  display_configurator_->Init(
+      ui::OzonePlatform::GetInstance()->CreateNativeDisplayDelegate(), false);
   display_configuration_observer_ =
       std::make_unique<DisplayConfigurationObserver>();
 
diff --git a/ash/shell_port.h b/ash/shell_port.h
index 2e39de5..b446ec6 100644
--- a/ash/shell_port.h
+++ b/ash/shell_port.h
@@ -15,15 +15,6 @@
 #include "ui/aura/client/window_types.h"
 #include "ui/base/ui_base_types.h"
 
-namespace aura {
-class Window;
-}
-
-namespace display {
-class NativeDisplayDelegate;
-class TouchTransformSetter;
-}
-
 namespace gfx {
 class Point;
 }
@@ -34,25 +25,14 @@
 }
 
 namespace ash {
-class AcceleratorController;
-class AshWindowTreeHost;
-struct AshWindowTreeHostInitParams;
-class KeyboardUI;
 class RootWindowController;
-class WindowCycleEventFilter;
-class WindowResizer;
-class WorkspaceEventHandler;
 
 enum class Config;
-enum class TaskSwitchSource;
-
-namespace wm {
-class TabletModeEventHandler;
-class WindowState;
-}
 
 // Porting layer for Shell. This class contains the part of Shell that are
 // different in classic ash and mus/mash.
+// DEPRECATED: Being removed, since there is no longer a distinct "classic"
+// config in ash. See https://crbug.com/866523
 class ASH_EXPORT ShellPort {
  public:
   virtual ~ShellPort();
@@ -64,34 +44,10 @@
 
   virtual Config GetAshConfig() const = 0;
 
-  // The return value from this is supplied to AshTouchTransformController; see
-  // it and TouchTransformSetter for details.
-  virtual std::unique_ptr<display::TouchTransformSetter>
-  CreateTouchTransformDelegate() = 0;
-
   // Shows the context menu for the wallpaper or shelf at |location_in_screen|.
   void ShowContextMenu(const gfx::Point& location_in_screen,
                        ui::MenuSourceType source_type);
 
-  // Returns a WindowResizer to handle dragging. |next_window_resizer| is
-  // the next WindowResizer in the WindowResizer chain. This may return
-  // |next_window_resizer|.
-  virtual std::unique_ptr<WindowResizer> CreateDragWindowResizer(
-      std::unique_ptr<WindowResizer> next_window_resizer,
-      wm::WindowState* window_state) = 0;
-
-  virtual std::unique_ptr<WindowCycleEventFilter>
-  CreateWindowCycleEventFilter() = 0;
-
-  virtual std::unique_ptr<wm::TabletModeEventHandler>
-  CreateTabletModeEventHandler() = 0;
-
-  virtual std::unique_ptr<WorkspaceEventHandler> CreateWorkspaceEventHandler(
-      aura::Window* workspace_window) = 0;
-
-  // Creates the KeyboardUI. This is called early on.
-  virtual std::unique_ptr<KeyboardUI> CreateKeyboardUI() = 0;
-
   // If |events| is PointerWatcherEventTypes::MOVES,
   // PointerWatcher::OnPointerEventObserved() is called for pointer move events.
   // If |events| is PointerWatcherEventTypes::DRAGS,
@@ -110,11 +66,6 @@
 
   virtual void CreatePointerWatcherAdapter() = 0;
 
-  // Creates an AshWindowTreeHost. A return value of null results in a platform
-  // specific AshWindowTreeHost being created.
-  virtual std::unique_ptr<AshWindowTreeHost> CreateAshWindowTreeHost(
-      const AshWindowTreeHostInitParams& init_params) = 0;
-
   // Called after the containers of |root_window_controller| have been created.
   // Allows ShellPort to install any additional state on the containers.
   virtual void OnCreatedRootWindowContainers(
@@ -134,15 +85,7 @@
   // Called after WindowTreeHostManager::InitHosts().
   virtual void OnHostsInitialized() = 0;
 
-  virtual std::unique_ptr<display::NativeDisplayDelegate>
-  CreateNativeDisplayDelegate() = 0;
-
-  // Called during startup to create the AcceleratorController.
-  virtual std::unique_ptr<AcceleratorController>
-  CreateAcceleratorController() = 0;
-
  private:
-  friend class AcceleratorControllerTest;
   friend class Shell;
 
   static ShellPort* instance_;
diff --git a/ash/shell_port_classic.cc b/ash/shell_port_classic.cc
index b23de42..d2707751 100644
--- a/ash/shell_port_classic.cc
+++ b/ash/shell_port_classic.cc
@@ -7,29 +7,12 @@
 #include <memory>
 #include <utility>
 
-#include "ash/accelerators/accelerator_controller.h"
-#include "ash/host/ash_window_tree_host.h"
-#include "ash/host/ash_window_tree_host_init_params.h"
-#include "ash/keyboard/keyboard_ui.h"
 #include "ash/keyboard/virtual_keyboard_controller.h"
 #include "ash/pointer_watcher_adapter_classic.h"
 #include "ash/public/cpp/config.h"
-#include "ash/public/cpp/immersive/immersive_fullscreen_controller.h"
 #include "ash/shell.h"
-#include "ash/wm/drag_window_resizer.h"
-#include "ash/wm/mru_window_tracker.h"
-#include "ash/wm/overview/window_selector_controller.h"
-#include "ash/wm/tablet_mode/scoped_disable_internal_mouse_and_keyboard.h"
-#include "ash/wm/tablet_mode/tablet_mode_event_handler_classic.h"
-#include "ash/wm/window_cycle_event_filter_classic.h"
-#include "ash/wm/window_util.h"
-#include "ash/wm/workspace/workspace_event_handler_classic.h"
-#include "base/memory/ptr_util.h"
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "ui/aura/env.h"
-#include "ui/display/manager/default_touch_transform_setter.h"
-#include "ui/display/types/native_display_delegate.h"
-#include "ui/ozone/public/ozone_platform.h"
 
 namespace ash {
 
@@ -53,37 +36,6 @@
   return Config::CLASSIC;
 }
 
-std::unique_ptr<display::TouchTransformSetter>
-ShellPortClassic::CreateTouchTransformDelegate() {
-  return std::make_unique<display::DefaultTouchTransformSetter>();
-}
-
-std::unique_ptr<WindowResizer> ShellPortClassic::CreateDragWindowResizer(
-    std::unique_ptr<WindowResizer> next_window_resizer,
-    wm::WindowState* window_state) {
-  return base::WrapUnique(
-      DragWindowResizer::Create(next_window_resizer.release(), window_state));
-}
-
-std::unique_ptr<WindowCycleEventFilter>
-ShellPortClassic::CreateWindowCycleEventFilter() {
-  return std::make_unique<WindowCycleEventFilterClassic>();
-}
-
-std::unique_ptr<wm::TabletModeEventHandler>
-ShellPortClassic::CreateTabletModeEventHandler() {
-  return std::make_unique<wm::TabletModeEventHandlerClassic>();
-}
-
-std::unique_ptr<WorkspaceEventHandler>
-ShellPortClassic::CreateWorkspaceEventHandler(aura::Window* workspace_window) {
-  return std::make_unique<WorkspaceEventHandlerClassic>(workspace_window);
-}
-
-std::unique_ptr<KeyboardUI> ShellPortClassic::CreateKeyboardUI() {
-  return KeyboardUI::Create();
-}
-
 void ShellPortClassic::AddPointerWatcher(
     views::PointerWatcher* watcher,
     views::PointerWatcherEventTypes events) {
@@ -106,12 +58,6 @@
   pointer_watcher_adapter_ = std::make_unique<PointerWatcherAdapterClassic>();
 }
 
-std::unique_ptr<AshWindowTreeHost> ShellPortClassic::CreateAshWindowTreeHost(
-    const AshWindowTreeHostInitParams& init_params) {
-  // A return value of null results in falling back to the default.
-  return nullptr;
-}
-
 void ShellPortClassic::OnCreatedRootWindowContainers(
     RootWindowController* root_window_controller) {}
 
@@ -119,16 +65,6 @@
 
 void ShellPortClassic::OnHostsInitialized() {}
 
-std::unique_ptr<display::NativeDisplayDelegate>
-ShellPortClassic::CreateNativeDisplayDelegate() {
-  return ui::OzonePlatform::GetInstance()->CreateNativeDisplayDelegate();
-}
-
-std::unique_ptr<AcceleratorController>
-ShellPortClassic::CreateAcceleratorController() {
-  return std::make_unique<AcceleratorController>(nullptr);
-}
-
 void ShellPortClassic::AddVideoDetectorObserver(
     viz::mojom::VideoDetectorObserverPtr observer) {
   aura::Env::GetInstance()
diff --git a/ash/shell_port_classic.h b/ash/shell_port_classic.h
index d4ce910..019e61dd 100644
--- a/ash/shell_port_classic.h
+++ b/ash/shell_port_classic.h
@@ -18,6 +18,8 @@
 
 // Implementation of ShellPort for classic ash/aura. See ash/README.md for more
 // details.
+// DEPRECATED: Being removed, since there is no longer a distinct "classic"
+// config in ash. See https://crbug.com/866523
 class ASH_EXPORT ShellPortClassic : public ShellPort {
  public:
   ShellPortClassic();
@@ -28,33 +30,16 @@
   // ShellPort:
   void Shutdown() override;
   Config GetAshConfig() const override;
-  std::unique_ptr<display::TouchTransformSetter> CreateTouchTransformDelegate()
-      override;
-  std::unique_ptr<WindowResizer> CreateDragWindowResizer(
-      std::unique_ptr<WindowResizer> next_window_resizer,
-      wm::WindowState* window_state) override;
-  std::unique_ptr<WindowCycleEventFilter> CreateWindowCycleEventFilter()
-      override;
-  std::unique_ptr<wm::TabletModeEventHandler> CreateTabletModeEventHandler()
-      override;
-  std::unique_ptr<WorkspaceEventHandler> CreateWorkspaceEventHandler(
-      aura::Window* workspace_window) override;
-  std::unique_ptr<KeyboardUI> CreateKeyboardUI() override;
   void AddPointerWatcher(views::PointerWatcher* watcher,
                          views::PointerWatcherEventTypes events) override;
   void RemovePointerWatcher(views::PointerWatcher* watcher) override;
   bool IsTouchDown() override;
   void ToggleIgnoreExternalKeyboard() override;
   void CreatePointerWatcherAdapter() override;
-  std::unique_ptr<AshWindowTreeHost> CreateAshWindowTreeHost(
-      const AshWindowTreeHostInitParams& init_params) override;
   void OnCreatedRootWindowContainers(
       RootWindowController* root_window_controller) override;
   void UpdateSystemModalAndBlockingContainers() override;
   void OnHostsInitialized() override;
-  std::unique_ptr<display::NativeDisplayDelegate> CreateNativeDisplayDelegate()
-      override;
-  std::unique_ptr<AcceleratorController> CreateAcceleratorController() override;
   void AddVideoDetectorObserver(
       viz::mojom::VideoDetectorObserverPtr observer) override;
 
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index a6ddd2bd..f59dca33 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> ቀርቷል</translation>
 <translation id="1698760176351776263">የIPv6 አድራሻ፦ <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">ይህ መሣሪያ በድርጅት የሚቀናበር ነው</translation>
+<translation id="1743570585616704562">አልታወቀም</translation>
 <translation id="1746730358044914197">የግቤት ስልቶች በእርስዎ አስተዳዳሪ ይዋቀራሉ።</translation>
 <translation id="1747827819627189109">በማያ ገጽ ላይ የቁልፍ ሰሌዳ ነቅቷል</translation>
 <translation id="1823873187264960516">ኤተርኔት፦ <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index f091c31f9..7d1fe40 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">الوقت المتبقي <ph name="TIME" /></translation>
 <translation id="1698760176351776263">‏عنوان IPv6:‏ <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">يخضع هذا الجهاز لإدارة المؤسسة</translation>
+<translation id="1743570585616704562">لم يتم التعرف عليها</translation>
 <translation id="1746730358044914197">تتم تهيئة طرق الإدخال بواسطة المشرف.</translation>
 <translation id="1747827819627189109">تم تفعيل لوحة المفاتيح على الشاشة</translation>
 <translation id="1823873187264960516">الإيثرنت: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index ea355f3..2c37268 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Оставащо време: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">IPv6 адрес: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Това устройство се управлява корпоративно</translation>
+<translation id="1743570585616704562">Не е разпознато</translation>
 <translation id="1746730358044914197">Методите на въвеждане са конфигурирани от администратора ви.</translation>
 <translation id="1747827819627189109">Екранната клавиатура е активирана</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 7ea06fd..6a97531 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> বাকি আছে</translation>
 <translation id="1698760176351776263">IPv6 ঠিকানা: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">এই ডিভাইসটি এন্টারপ্রাইজ পরিচালিত</translation>
+<translation id="1743570585616704562">শনাক্ত করা যায়নি</translation>
 <translation id="1746730358044914197">আপনার প্রশাসক ইনপুটের পদ্ধতিগুলি কনফিগার করে।</translation>
 <translation id="1747827819627189109">অন-স্ক্রিন কীবোর্ড সক্ষম করা রয়েছে</translation>
 <translation id="1823873187264960516">ইথারনেট: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index bea3795..aa73897 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Temps restant: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Adreça IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Aquest dispositiu està gestionat per una empresa</translation>
+<translation id="1743570585616704562">No s'ha reconegut</translation>
 <translation id="1746730358044914197">Els mètodes d'introducció estan configurats per l'administrador.</translation>
 <translation id="1747827819627189109">Teclat en pantalla activat</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 4688c57..dec11ea 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Zbývající čas: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Toto zařízení je spravováno organizací</translation>
+<translation id="1743570585616704562">Nerozpoznáno</translation>
 <translation id="1746730358044914197">Metody zadávání nastavuje váš administrátor.</translation>
 <translation id="1747827819627189109">Softwarová klávesnice je aktivována</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 7d4145d..195c4f6 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> tilbage</translation>
 <translation id="1698760176351776263">IPv6-adresse: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Denne enhed er virksomhedsadministreret</translation>
+<translation id="1743570585616704562">Ikke genkendt</translation>
 <translation id="1746730358044914197">Indtastningsmetoder konfigureres af din administrator.</translation>
 <translation id="1747827819627189109">Skærmtastaturet er aktiveret</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index d1ec2b4..c6ce8e5 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Verbleibende Zeit: <ph name="TIME" /> h</translation>
 <translation id="1698760176351776263">IPv6-Adresse: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Dieses Gerät wird vom Unternehmen verwaltet</translation>
+<translation id="1743570585616704562">Nicht erkannt</translation>
 <translation id="1746730358044914197">Die Eingabemethoden werden von Ihrem Administrator konfiguriert.</translation>
 <translation id="1747827819627189109">Bildschirmtastatur aktiviert</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 566d2b2..e306b57 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Απομένουν <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Διεύθυνση IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Αυτή η συσκευή βρίσκεται υπό τη διαχείριση επιχείρησης</translation>
+<translation id="1743570585616704562">Δεν αναγνωρίστηκε</translation>
 <translation id="1746730358044914197">Οι μέθοδοι εισαγωγής έχουν διαμορφωθεί από τον διαχειριστή σας.</translation>
 <translation id="1747827819627189109">Το πληκτρολόγιο οθόνης είναι ενεργοποιημένο</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 63583fb..0e88e703 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> left</translation>
 <translation id="1698760176351776263">IPv6 address: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">This device is enterprise managed</translation>
+<translation id="1743570585616704562">Not recognised</translation>
 <translation id="1746730358044914197">Input methods are configured by your administrator.</translation>
 <translation id="1747827819627189109">On-screen keyboard enabled</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index 7db6992..3142927 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Tiempo restante <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Dirección IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Este dispositivo está administrado por una empresa</translation>
+<translation id="1743570585616704562">No se reconoció</translation>
 <translation id="1746730358044914197">Tu administrador configura los métodos de entrada.</translation>
 <translation id="1747827819627189109">Teclado en pantalla habilitado</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index fbc6e91c..4b97d6f7 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Queda: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Dirección IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Este es un dispositivo administrado por la empresa</translation>
+<translation id="1743570585616704562">No se ha reconocido</translation>
 <translation id="1746730358044914197">El administrador configura los métodos de introducción.</translation>
 <translation id="1747827819627189109">Teclado en pantalla habilitado</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index edd77bb..9dfbc264 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> tühjenemiseni</translation>
 <translation id="1698760176351776263">IPv6-aadress: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Seda seadet haldab ettevõte</translation>
+<translation id="1743570585616704562">Ei tuvastatud</translation>
 <translation id="1746730358044914197">Sisestusmeetodid seadistab teie administraator.</translation>
 <translation id="1747827819627189109">Ekraanil kuvatav klaviatuur on lubatud</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index d85eb1c9..de83be2 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> باقی‌مانده</translation>
 <translation id="1698760176351776263">‏نشانی IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">این دستگاه توسط سازمانی مدیریت می‌شود</translation>
+<translation id="1743570585616704562">شناسایی نشد</translation>
 <translation id="1746730358044914197">روش‌های ورودی توسط سرپرستتان پیکربندی می‌شوند.</translation>
 <translation id="1747827819627189109">صفحه‌کلید روی صفحه فعال شد</translation>
 <translation id="1823873187264960516">اترنت: <ph name="ADDRESS" /></translation>
@@ -46,6 +47,7 @@
 <translation id="1882897271359938046">بازتاب به <ph name="DISPLAY_NAME" /></translation>
 <translation id="1885785240814121742">باز کردن قفل با اثر انگشت</translation>
 <translation id="1919743966458266018">کلیدهای میان‌بر باز کردن مدیر فعالیت‌ها تغییر کرده است. لطفاً از <ph name="NEW_SHORTCUT" /> به جای <ph name="OLD_SHORTCUT" /> استفاده کنید.</translation>
+<translation id="1923508880661655826">وقتی از سیستم خارج شوید، جلسه‌تان پاک می‌شود. <ph name="LEARN_MORE" /></translation>
 <translation id="1923539912171292317">کلیک‌های خودکار</translation>
 <translation id="1928739107511554905">‏برای دریافت به‌روزرسانی، از صفحه لمسی برای بازراه‌اندازی Chromebook خود با صفحه‌کلید متصل استفاده کنید.</translation>
 <translation id="1942830294380034169">دکمه سرریز</translation>
@@ -207,7 +209,9 @@
 <translation id="4905614135390995787">میان‌بر روشن/خاموش کردن «حالت تضاد بالا» تغییر کرده است. لطفاً به‌جای <ph name="OLD_SHORTCUT" /> از <ph name="NEW_SHORTCUT" /> استفاده کنید.</translation>
 <translation id="4917385247580444890">قوی</translation>
 <translation id="4918086044614829423">می‌پذیرم</translation>
+<translation id="4924411785043111640">بازراه‌اندازی و بازنشانی</translation>
 <translation id="4961318399572185831">فرستادن صفحه</translation>
+<translation id="5069971504769299223">ممکن است مدیر دستگاه بر فعالیتتان نظارت داشته باشد.</translation>
 <translation id="5136175204352732067">صفحه‌کلید دیگری متصل شد</translation>
 <translation id="5168181903108465623">دستگاه‌های فرستادن موجود هستند</translation>
 <translation id="5207949376430453814">برجسته کردن هشتک نوشتار</translation>
@@ -221,6 +225,7 @@
 <translation id="544691375626129091">تمام کاربران موجود قبلاً به این جلسه اضافه شده‌اند.</translation>
 <translation id="5457599981699367932">مرور کردن به‌عنوان یک مهمان</translation>
 <translation id="54609108002486618">مدیریت شده</translation>
+<translation id="5496819745535887422">سرپرست درحال عقب‌گرد کردن دستگاهتان است. همه داده‌ها بعد از بازراه‌اندازی دستگاه پاک می‌شود.</translation>
 <translation id="553675580533261935">خروج از جلسه</translation>
 <translation id="5537725057119320332">فرستادن</translation>
 <translation id="5548285847212963613">افزونه «<ph name="EXTENSION_NAME" />» می‌تواند در اتصال به این شبکه به شما کمک کند.</translation>
@@ -291,6 +296,7 @@
 <translation id="6627638273713273709">Search+Shift+K</translation>
 <translation id="6650933572246256093">دستگاه بلوتوث «<ph name="DEVICE_NAME" />» برای مرتبط‌سازی به مجوز نیاز دارد. لطفاً این کلیدواژه را در آن دستگاه وارد کنید: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">گذرواژه</translation>
+<translation id="6687966522050791666">انتخاب زبان و ورودی</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">لازم است صفحه‌کلید قابل جدا شدن به‌روزرسانی ضروری شود</translation>
 <translation id="6700713906295497288">‏دکمه منو IME</translation>
@@ -408,6 +414,7 @@
 <translation id="8984179138335769204">راه‌اندازی سریع</translation>
 <translation id="8995603266996330174">مدیریت شده توسط <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">‏به‌روزرسانی Adobe Flash Player دردسترس است</translation>
+<translation id="9056839673611986238">دستگاه عقب‌گرد می‌کند</translation>
 <translation id="9074739597929991885">بلوتوث</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">میکروفون در حال استفاده است.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index f76d68e..64772ebc 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> jäljellä</translation>
 <translation id="1698760176351776263">IPv6-osoite: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Tämä laite on yrityksen hallinnoima.</translation>
+<translation id="1743570585616704562">Ei tunnistettu</translation>
 <translation id="1746730358044914197">Järjestelmänvalvoja on määrittänyt syöttötavat.</translation>
 <translation id="1747827819627189109">Ruutunäppäimistö otettiin käyttöön</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 377eb82..07a7b3f7 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> na lang ang natitira</translation>
 <translation id="1698760176351776263">IPv6 address: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Ang device na ito ay pinamamahalaan ng enterprise</translation>
+<translation id="1743570585616704562">Hindi nakilala</translation>
 <translation id="1746730358044914197">Isinasaayos ng iyong administrator ang mga pamamaraan sa pag-input.</translation>
 <translation id="1747827819627189109">Naka-enable ang on-screen na keyboard</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 74d75791..5b638f8b 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Temps restant : <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Adresse IPv6 : <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Cet appareil est géré par une entreprise</translation>
+<translation id="1743570585616704562">Non reconnu</translation>
 <translation id="1746730358044914197">Les modes de saisie sont configurés par votre administrateur.</translation>
 <translation id="1747827819627189109">Clavier à l'écran activé</translation>
 <translation id="1823873187264960516">Ethernet : <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 0f431fc..031380d 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> બાકી</translation>
 <translation id="1698760176351776263">IPv6 સરનામું: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">આ ઉપકરણ એન્ટરપ્રાઇઝ દ્વારા સંચાલિત થાય છે</translation>
+<translation id="1743570585616704562">ઓળખાયેલ નથી</translation>
 <translation id="1746730358044914197">ઇનપુટ પદ્ધતિઓને તમારા વ્યવસ્થાપક દ્વારા ગોઠવવામાં આવી છે.</translation>
 <translation id="1747827819627189109">ઓન-સ્ક્રીન કીબોર્ડ સક્ષમ કર્યું</translation>
 <translation id="1823873187264960516">ઇથરનેટ: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 935a9a8..740e81bd 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> शेष</translation>
 <translation id="1698760176351776263">IPv6 पता: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">यह डिवाइस एंटरप्राइज़ द्वारा प्रबंधित है</translation>
+<translation id="1743570585616704562">उंगली की पहचान नहीं हो सकी</translation>
 <translation id="1746730358044914197">इनपुट विधियों को आपका व्यवस्थापक कॉन्फ़िगर करता है.</translation>
 <translation id="1747827819627189109">ऑन-स्‍क्रीन कीबोर्ड सक्षम है</translation>
 <translation id="1823873187264960516">ईथरनेट: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index aec9fbf..a32adb6 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Još <ph name="TIME" /></translation>
 <translation id="1698760176351776263">IPv6 adresa: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Ovim uređajem upravlja tvrtka</translation>
+<translation id="1743570585616704562">Nije prepoznat</translation>
 <translation id="1746730358044914197">Načine unosa konfigurira administrator.</translation>
 <translation id="1747827819627189109">Tipkovnica na zaslonu omogućena je</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index d4cf19792..f595a3d5 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> van hátra</translation>
 <translation id="1698760176351776263">IPv6-cím: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Az eszközt a vállalat felügyeli</translation>
+<translation id="1743570585616704562">Nem sikerült felismerni</translation>
 <translation id="1746730358044914197">A rendszergazda állította be a beviteli módszereket.</translation>
 <translation id="1747827819627189109">Képernyő-billentyűzet bekapcsolva</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 18d8fe5..bd5ddf94 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Sisa waktu <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Alamat IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Perangkat ini dikelola perusahaan</translation>
+<translation id="1743570585616704562">Tidak dikenali</translation>
 <translation id="1746730358044914197">Metode masukan dikonfigurasi oleh administrator.</translation>
 <translation id="1747827819627189109">Keyboard di layar diaktifkan</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index d570ff06..b49d098 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> rimanenti</translation>
 <translation id="1698760176351776263">Indirizzo IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Questo dispositivo è gestito dall'azienda</translation>
+<translation id="1743570585616704562">Non riconosciuta</translation>
 <translation id="1746730358044914197">I metodi di immissione vengono configurati dall'amministratore.</translation>
 <translation id="1747827819627189109">Tastiera sullo schermo attiva</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 467d78ee0..1e95b12 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">זמן נותר - <ph name="TIME" /></translation>
 <translation id="1698760176351776263">‏כתובת IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">המכשיר הזה מנוהל על ידי ארגון</translation>
+<translation id="1743570585616704562">לא מזוהה</translation>
 <translation id="1746730358044914197">מנהל המערכת שלך מגדיר את שיטות הקלט.</translation>
 <translation id="1747827819627189109">המקלדת שמופיעה במסך מופעלת</translation>
 <translation id="1823873187264960516">אתרנט: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 384f3a4..cadfb0e 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">あと <ph name="TIME" /></translation>
 <translation id="1698760176351776263">IPv6 アドレス: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">このデバイスは会社が管理しています</translation>
+<translation id="1743570585616704562">認識されませんでした</translation>
 <translation id="1746730358044914197">入力方法は管理者によって設定されています。</translation>
 <translation id="1747827819627189109">画面キーボードが有効です</translation>
 <translation id="1823873187264960516">イーサネット: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 791df87..a4c330a 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> ಬಾಕಿ ಉಳಿದಿದೆ</translation>
 <translation id="1698760176351776263">IPv6 ವಿಳಾಸ: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">ಈ ಸಾಧನವನ್ನು ಎಂಟರ್‌ಪ್ರೈಸ್ ನಿರ್ವಹಣೆ ಮಾಡುತ್ತಿದೆ</translation>
+<translation id="1743570585616704562">ಗುರುತಿಸಲಾಗಿಲ್ಲ</translation>
 <translation id="1746730358044914197">ನಿಮ್ಮ ಇನ್‌ಪುಟ್‌ ವಿಧಾನಗಳನ್ನು ನಿರ್ವಾಹಕರ ಸಹಾಯದಿಂದ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="1747827819627189109">ಆನ್ ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="1823873187264960516">ಇಥರ್ನೆಟ್: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 5ddd3c9..d8dc688 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> 남음</translation>
 <translation id="1698760176351776263">IPv6 주소: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">기업에서 관리하는 기기입니다.</translation>
+<translation id="1743570585616704562">인식할 수 없음</translation>
 <translation id="1746730358044914197">입력 방법은 관리자가 설정합니다.</translation>
 <translation id="1747827819627189109">터치 키보드 사용 설정됨</translation>
 <translation id="1823873187264960516">이더넷: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 4e73211..45e0df0 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Liko <ph name="TIME" /></translation>
 <translation id="1698760176351776263">„IPv6“ adresas: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Šis įrenginys valdomas įmonės</translation>
+<translation id="1743570585616704562">Neatpažinta</translation>
 <translation id="1746730358044914197">Įvesties metodus konfigūruoja jūsų administratorius.</translation>
 <translation id="1747827819627189109">Ekrano klaviatūra įgalinta</translation>
 <translation id="1823873187264960516">Eternetas: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index fab9c0a..104f599 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Atlikušais laiks: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">IPv6 adrese: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Šo ierīci pārvalda uzņēmums</translation>
+<translation id="1743570585616704562">Nav atpazīts</translation>
 <translation id="1746730358044914197">Administrators konfigurē ievades metodes.</translation>
 <translation id="1747827819627189109">Ekrāna tastatūra iespējota</translation>
 <translation id="1823873187264960516">Ethernet adrese: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 25fa1b6d..0ac6d7c5f9 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> ശേഷിക്കുന്നു</translation>
 <translation id="1698760176351776263">IPv6 വിലാസം: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">ഈ ഉപകരണം മാനേജുചെയ്യുന്നത് എന്റർപ്രൈസാണ്</translation>
+<translation id="1743570585616704562">തിരിച്ചറിഞ്ഞില്ല</translation>
 <translation id="1746730358044914197">ഇൻപുട്ട് രീതികൾ കോൺഫിഗർ ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററാണ്.</translation>
 <translation id="1747827819627189109">ഓൺ‌ സ്‌ക്രീൻ കീ‌ബോർഡ് പ്രവർത്തനക്ഷമമാക്കി</translation>
 <translation id="1823873187264960516">ഇതർനെറ്റ്: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 4e3f456..8be4194 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> शिल्लक</translation>
 <translation id="1698760176351776263">IPv6 पत्ता: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">या डिव्हाइसला संस्थेेने व्यवस्थापित केेले आहे</translation>
+<translation id="1743570585616704562">ओळखले नाही</translation>
 <translation id="1746730358044914197">तुमच्या प्रशासकाद्वारे कॉन्फिगर केलेल्या इनपुट पद्धती.</translation>
 <translation id="1747827819627189109">ऑन-स्क्रीन कीबोर्ड सक्षम</translation>
 <translation id="1823873187264960516">इथरनेट: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index b740d34b..84aa3a22 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Berbaki <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Alamat IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Peranti ini diurus perusahaan</translation>
+<translation id="1743570585616704562">Tidak dikenali</translation>
 <translation id="1746730358044914197">Kaedah masukan dikonfigurasi oleh pentadbir anda.</translation>
 <translation id="1747827819627189109">Papan kekunci pada skrin didayakan</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index a60c253..6c53591 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> resterend</translation>
 <translation id="1698760176351776263">IPv6-adres: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Dit apparaat wordt beheerd door een onderneming</translation>
+<translation id="1743570585616704562">Niet herkend</translation>
 <translation id="1746730358044914197">Invoermethoden worden ingesteld door je beheerder.</translation>
 <translation id="1747827819627189109">Schermtoetsenbord ingeschakeld</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 5fcb722..c419a330 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> igjen</translation>
 <translation id="1698760176351776263">IPv6-adresse: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Denne enheten er administrert av en bedrift</translation>
+<translation id="1743570585616704562">Ikke gjenkjent</translation>
 <translation id="1746730358044914197">Inndatametoder konfigureres av administratoren din.</translation>
 <translation id="1747827819627189109">Skjermtastaturet er aktivert</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
@@ -46,6 +47,7 @@
 <translation id="1882897271359938046">Speiler <ph name="DISPLAY_NAME" /></translation>
 <translation id="1885785240814121742">Lås opp med fingeravtrykk</translation>
 <translation id="1919743966458266018">Snarveien for å åpne oppgavebehandlingen er endret. Bruk <ph name="NEW_SHORTCUT" /> i stedet for <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="1923508880661655826">Økten din slettes når du logger av. <ph name="LEARN_MORE" /></translation>
 <translation id="1923539912171292317">Automatiske klikk</translation>
 <translation id="1928739107511554905">For å laste ned oppdateringen, bruk berøringsskjermen til å starte Chromebooken på nytt med tastaturet tilkoblet.</translation>
 <translation id="1942830294380034169">Overflyt-knapp</translation>
@@ -206,7 +208,9 @@
 <translation id="4905614135390995787">Hurtigtasten for å slå høykontrastmodus av eller på er endret. Bruk <ph name="NEW_SHORTCUT" /> i stedet for <ph name="OLD_SHORTCUT" />.</translation>
 <translation id="4917385247580444890">Sterk</translation>
 <translation id="4918086044614829423">Godta</translation>
+<translation id="4924411785043111640">Start på nytt og tilbakestill</translation>
 <translation id="4961318399572185831">Cast skjermen</translation>
+<translation id="5069971504769299223">Enhetsadministratoren kan muligens overvåke aktiviteten din.</translation>
 <translation id="5136175204352732067">Et annet tastatur er koblet til</translation>
 <translation id="5168181903108465623">Cast-enheter er tilgjengelige</translation>
 <translation id="5207949376430453814">Fremhev tekstinnsettingspunktet</translation>
@@ -220,6 +224,7 @@
 <translation id="544691375626129091">Alle tilgjengelige brukere er allerede lagt til i denne økten.</translation>
 <translation id="5457599981699367932">Surf som gjest</translation>
 <translation id="54609108002486618">Administrert</translation>
+<translation id="5496819745535887422">Administratoren din kaller tilbake enheten din. Alle data blir slettet når enheten starter på nytt.</translation>
 <translation id="553675580533261935">Avslutning av økten</translation>
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5548285847212963613">Utvidelsen «<ph name="EXTENSION_NAME" />» kan hjelpe deg med å koble deg til dette nettverket.</translation>
@@ -290,6 +295,7 @@
 <translation id="6627638273713273709">Søk + Shift + K</translation>
 <translation id="6650933572246256093">Bluetooth-enheten «<ph name="DEVICE_NAME" />» ber om tillatelse til å koble til. Skriv inn denne tilgangskoden på den aktuelle enheten: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Passord</translation>
+<translation id="6687966522050791666">Velg språk og inndata</translation>
 <translation id="6691659475504239918">Søk + Shift + H</translation>
 <translation id="6696025732084565524">Det avtakbare tastaturet trenger en kritisk oppdatering</translation>
 <translation id="6700713906295497288">IME-menyknappen</translation>
@@ -407,6 +413,7 @@
 <translation id="8984179138335769204">Hurtigtaster</translation>
 <translation id="8995603266996330174">Drevet av <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">En oppdatering av Adobe Flash Player er tilgjengelig</translation>
+<translation id="9056839673611986238">Enheten vil hentes tilbake</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">Mikrofonen er i bruk.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 2e1c297..2c07c837 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Pozostało <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Adres IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Tym urządzeniem zarządza firma</translation>
+<translation id="1743570585616704562">Nie rozpoznano</translation>
 <translation id="1746730358044914197">Metody wprowadzania zostały skonfigurowane przez administratora.</translation>
 <translation id="1747827819627189109">Klawiatura ekranowa włączona</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index f47c5a6a..f2051771 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation>
 <translation id="1698760176351776263">Endereço IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Este dispositivo é gerenciado por uma empresa</translation>
+<translation id="1743570585616704562">Não reconhecida</translation>
 <translation id="1746730358044914197">Os métodos de entrada são configurados pelo administrador.</translation>
 <translation id="1747827819627189109">Teclado na tela ativado</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 7975e4f0..4d207e5 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation>
 <translation id="1698760176351776263">Endereço IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Este dispositivo é gerido pela empresa</translation>
+<translation id="1743570585616704562">Não reconhecida</translation>
 <translation id="1746730358044914197">Os métodos de introdução são configurados pelo gestor.</translation>
 <translation id="1747827819627189109">Teclado no ecrã ativado</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 64eb6bf..5e534d8 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Timp rămas: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Adresă IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Acest dispozitiv este gestionat de companie</translation>
+<translation id="1743570585616704562">Nu este recunoscută</translation>
 <translation id="1746730358044914197">Metodele de introducere a textului sunt configurate de administratorul tău.</translation>
 <translation id="1747827819627189109">Tastatură pe ecran activată</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index b322584..b84162b 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Ещё <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Адрес IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Это корпоративное устройство</translation>
+<translation id="1743570585616704562">Не распознано</translation>
 <translation id="1746730358044914197">Способы ввода настраиваются администратором</translation>
 <translation id="1747827819627189109">Экранная клавиатура включена</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
@@ -46,6 +47,7 @@
 <translation id="1882897271359938046">Дублирование экрана в <ph name="DISPLAY_NAME" /></translation>
 <translation id="1885785240814121742">Используйте разблокировку по отпечатку пальца</translation>
 <translation id="1919743966458266018">Изменились быстрые клавиши для запуска диспетчера задач. Используйте <ph name="NEW_SHORTCUT" /> вместо <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="1923508880661655826">После выхода из аккаунта данные о сеансе будут удалены. <ph name="LEARN_MORE" /></translation>
 <translation id="1923539912171292317">Автоматическое нажатие</translation>
 <translation id="1928739107511554905">Чтобы выполнить обновление, перезагрузите устройство Chromebook с помощью сенсорной панели, не отключая от него клавиатуру.</translation>
 <translation id="1942830294380034169">Кнопка переполнения</translation>
@@ -206,7 +208,9 @@
 <translation id="4905614135390995787">Изменились быстрые клавиши для управления режимом высокой контрастности. Используйте <ph name="NEW_SHORTCUT" /> вместо <ph name="OLD_SHORTCUT" />.</translation>
 <translation id="4917385247580444890">Сильный</translation>
 <translation id="4918086044614829423">Принять</translation>
+<translation id="4924411785043111640">Перезапустить и сбросить настройки</translation>
 <translation id="4961318399572185831">Трансляция экрана</translation>
+<translation id="5069971504769299223">Администратор может отслеживать ваши действия на этом устройстве.</translation>
 <translation id="5136175204352732067">Подключена другая клавиатура</translation>
 <translation id="5168181903108465623">Доступны устройства для трансляции</translation>
 <translation id="5207949376430453814">Выделять курсор при вводе текста</translation>
@@ -220,6 +224,7 @@
 <translation id="544691375626129091">В этот сеанс уже добавлены все доступные пользователи.</translation>
 <translation id="5457599981699367932">Войти в гостевой режим</translation>
 <translation id="54609108002486618">Автоматическое управление</translation>
+<translation id="5496819745535887422">Администратор возвращает ваше устройство к прежней версии системы. После перезагрузки все данные с устройства будут удалены.</translation>
 <translation id="553675580533261935">Завершение сеанса</translation>
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5548285847212963613">Подключиться к этой сети можно с помощью расширения "<ph name="EXTENSION_NAME" />".</translation>
@@ -290,6 +295,7 @@
 <translation id="6627638273713273709">Поиск + Shift + K</translation>
 <translation id="6650933572246256093">Устройству <ph name="DEVICE_NAME" /> требуется разрешение на подключение через Bluetooth. Введите на нем код: <ph name="PASSKEY" />.</translation>
 <translation id="6657585470893396449">Пароль</translation>
+<translation id="6687966522050791666">Выбрать язык и способ ввода</translation>
 <translation id="6691659475504239918">ПОИСК + SHIFT + H</translation>
 <translation id="6696025732084565524">Необходимо обновить внешнюю клавиатуру</translation>
 <translation id="6700713906295497288">Кнопка меню редактора методов ввода</translation>
@@ -407,6 +413,7 @@
 <translation id="8984179138335769204">Быстрый запуск</translation>
 <translation id="8995603266996330174">В домене <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Доступно обновление для Adobe Flash Player</translation>
+<translation id="9056839673611986238">Система на устройстве будет возвращена к предыдущей версии</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">Микрофон используется</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index ef6275c..46ae3ce 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Zostávajúci čas: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Toto zariadenie je spravované organizáciou</translation>
+<translation id="1743570585616704562">Nerozpoznané</translation>
 <translation id="1746730358044914197">Metódy vstupu sú nakonfigurované vaším správcom.</translation>
 <translation id="1747827819627189109">Klávesnica na obrazovke je povolená</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 8244d50..7a6ea93 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Še <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Naslov IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">To napravo upravlja podjetje</translation>
+<translation id="1743570585616704562">Ni prepoznano</translation>
 <translation id="1746730358044914197">Načine vnosa konfigurira skrbnik.</translation>
 <translation id="1747827819627189109">Zaslonska tipkovnica omogočena</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 80943b42..4f3f13e 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> је преостало</translation>
 <translation id="1698760176351776263">IPv6 адреса: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Овим уређајем управља предузеће</translation>
+<translation id="1743570585616704562">Није препознат</translation>
 <translation id="1746730358044914197">Методе уноса конфигурише администратор.</translation>
 <translation id="1747827819627189109">Тастатура на екрану је омогућена</translation>
 <translation id="1823873187264960516">Етернет: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 1fafcc2b..86717ba 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> kvar</translation>
 <translation id="1698760176351776263">IPv6-adress: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Enheten är företagshanterad</translation>
+<translation id="1743570585616704562">Identifierades inte</translation>
 <translation id="1746730358044914197">Inmatningsmetoderna konfigureras av administratören.</translation>
 <translation id="1747827819627189109">Skärmen på tangentbordet har aktiverats</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 0cc866e..665dc21 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Zimesalia <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Anwani ya IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Kifaa hiki kinadhibitiwa kibiashara</translation>
+<translation id="1743570585616704562">Haikutambua alama ya kidole</translation>
 <translation id="1746730358044914197">Mbinu za kuingiza data zimewekwa na msimamizi wako.</translation>
 <translation id="1747827819627189109">Kibodi ya skrini imewashwa</translation>
 <translation id="1823873187264960516">Ethaneti: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 18d7ce7..dde1ef25 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> மணி நேரம்</translation>
 <translation id="1698760176351776263">IPv6 முகவரி: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">இந்தச் சாதனத்தை நிர்வகிப்பது: நிறுவனம்</translation>
+<translation id="1743570585616704562">அடையாளங்காண முடியவில்லை</translation>
 <translation id="1746730358044914197">உள்ளீட்டு முறைகளை உங்கள் நிர்வாகி உள்ளமைத்துள்ளார்.</translation>
 <translation id="1747827819627189109">ஆன்ஸ்க்ரீன் விசைப்பலகை இயக்கப்பட்டது</translation>
 <translation id="1823873187264960516">ஈதர்நெட்: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index beb5ac16..7fc64a5 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> మిగిలి ఉంది</translation>
 <translation id="1698760176351776263">IPv6 చిరునామా: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">ఈ పరికరం సంస్థ ద్వారా నిర్వహించబడుతోంది</translation>
+<translation id="1743570585616704562">గుర్తించలేదు</translation>
 <translation id="1746730358044914197">ఇన్‌పుట్ పద్ధతులు మీ నిర్వాహకుల ద్వారా కాన్ఫిగర్ చేయబడ్డాయి.</translation>
 <translation id="1747827819627189109">స్క్రీన్‌పై కనిపించే కీబోర్డ్ ప్రారంభించబడింది</translation>
 <translation id="1823873187264960516">ఈథర్‌నెట్: <ph name="ADDRESS" /></translation>
@@ -276,7 +277,7 @@
 <translation id="639644700271529076">CAPS LOCK ఆపివేయబడింది</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">పూర్తయింది</translation>
-<translation id="6445835306623867477"><ph name="ROUTE_TITLE" />లో <ph name="RECEIVER_NAME" /></translation>
+<translation id="6445835306623867477"><ph name="RECEIVER_NAME" />లో <ph name="ROUTE_TITLE" /></translation>
 <translation id="6452181791372256707">తిరస్కరించు</translation>
 <translation id="6453179446719226835">భాష మార్చబడింది</translation>
 <translation id="6459472438155181876"><ph name="DISPLAY_NAME" />కు స్క్రీన్‌ను విస్తరిస్తోంది</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 17c346d..afb2085 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">ใช้ได้อีก <ph name="TIME" /></translation>
 <translation id="1698760176351776263">ที่อยู่ IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">อุปกรณ์นี้ได้รับการจัดการโดยองค์กร</translation>
+<translation id="1743570585616704562">ไม่รู้จัก</translation>
 <translation id="1746730358044914197">ผู้ดูแลระบบเป็นคนกำหนดค่าวิธีการป้อนข้อมูล</translation>
 <translation id="1747827819627189109">เปิดใช้แป้นพิมพ์บนหน้าจออยู่</translation>
 <translation id="1823873187264960516">อีเทอร์เน็ต: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index de3541e..033eb49e 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Kalan süre: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">IPv6 adresi: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Bu cihaz kuruluş tarafından yönetiliyor</translation>
+<translation id="1743570585616704562">Tanınmadı</translation>
 <translation id="1746730358044914197">Giriş yöntemleri, yöneticiniz tarafından yapılandırılır.</translation>
 <translation id="1747827819627189109">Dokunmatik klavye etkin</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 2d50fb9..44c4264 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Залишилося <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Адреса IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Цим пристроєм керує адміністратор підприємства</translation>
+<translation id="1743570585616704562">Не розпізнано</translation>
 <translation id="1746730358044914197">Адміністратор налаштував методи введення.</translation>
 <translation id="1747827819627189109">Екранну клавіатуру ввімкнено</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 9c9dcb7..9d47bbb 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">Còn <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Địa chỉ IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Thiết bị này do doanh nghiệp quản lý</translation>
+<translation id="1743570585616704562">Không nhận dạng được</translation>
 <translation id="1746730358044914197">Các phương thức nhập do quản trị viên của bạn định cấu hình.</translation>
 <translation id="1747827819627189109">Đã bật bàn phím ảo</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 24eeec9..bea7d6f 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478">电量尚余 <ph name="TIME" /></translation>
 <translation id="1698760176351776263">IPv6 地址:<ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">此设备是受企业管理的设备</translation>
+<translation id="1743570585616704562">无法识别</translation>
 <translation id="1746730358044914197">输入法是由您的管理员配置的。</translation>
 <translation id="1747827819627189109">屏幕键盘已启用</translation>
 <translation id="1823873187264960516">以太网:<ph name="ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 82e4dc8..80caa8c 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -37,6 +37,7 @@
 <translation id="1677472565718498478"><ph name="TIME" /> 後用盡</translation>
 <translation id="1698760176351776263">IPv6 位址:<ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">這個裝置受到企業管理</translation>
+<translation id="1743570585616704562">無法識別</translation>
 <translation id="1746730358044914197">輸入法是由你的管理員所設定。</translation>
 <translation id="1747827819627189109">螢幕小鍵盤已啟用</translation>
 <translation id="1823873187264960516">乙太網路:<ph name="ADDRESS" /></translation>
diff --git a/ash/wm/drag_window_resizer.cc b/ash/wm/drag_window_resizer.cc
index 6135c89d..f3239b3 100644
--- a/ash/wm/drag_window_resizer.cc
+++ b/ash/wm/drag_window_resizer.cc
@@ -4,6 +4,8 @@
 
 #include "ash/wm/drag_window_resizer.h"
 
+#include <utility>
+
 #include "ash/display/mouse_cursor_event_filter.h"
 #include "ash/shell.h"
 #include "ash/wm/drag_window_controller.h"
@@ -48,12 +50,6 @@
     instance_ = NULL;
 }
 
-// static
-DragWindowResizer* DragWindowResizer::Create(WindowResizer* next_window_resizer,
-                                             wm::WindowState* window_state) {
-  return new DragWindowResizer(next_window_resizer, window_state);
-}
-
 void DragWindowResizer::Drag(const gfx::Point& location, int event_flags) {
   base::WeakPtr<DragWindowResizer> resizer(weak_ptr_factory_.GetWeakPtr());
   next_window_resizer_->Drag(location, event_flags);
@@ -129,10 +125,11 @@
   GetTarget()->layer()->SetOpacity(details().initial_opacity);
 }
 
-DragWindowResizer::DragWindowResizer(WindowResizer* next_window_resizer,
-                                     wm::WindowState* window_state)
+DragWindowResizer::DragWindowResizer(
+    std::unique_ptr<WindowResizer> next_window_resizer,
+    wm::WindowState* window_state)
     : WindowResizer(window_state),
-      next_window_resizer_(next_window_resizer),
+      next_window_resizer_(std::move(next_window_resizer)),
       weak_ptr_factory_(this) {
   // The pointer should be confined in one display during resizing a window
   // because the window cannot span two displays at the same time anyway. The
diff --git a/ash/wm/drag_window_resizer.h b/ash/wm/drag_window_resizer.h
index 9fe0b2e..2abd6be01 100644
--- a/ash/wm/drag_window_resizer.h
+++ b/ash/wm/drag_window_resizer.h
@@ -23,14 +23,12 @@
 // drag windows across displays.
 class ASH_EXPORT DragWindowResizer : public WindowResizer {
  public:
+  // Creates DragWindowResizer that adds the ability of dragging windows across
+  // displays to |next_window_resizer|.
+  DragWindowResizer(std::unique_ptr<WindowResizer> next_window_resizer,
+                    wm::WindowState* window_state);
   ~DragWindowResizer() override;
 
-  // Creates a new DragWindowResizer. The caller takes ownership of the
-  // returned object. The ownership of |next_window_resizer| is taken by the
-  // returned object. Returns NULL if not resizable.
-  static DragWindowResizer* Create(WindowResizer* next_window_resizer,
-                                   wm::WindowState* window_state);
-
   // WindowResizer:
   void Drag(const gfx::Point& location, int event_flags) override;
   void CompleteDrag() override;
@@ -44,11 +42,6 @@
   FRIEND_TEST_ALL_PREFIXES(DragWindowResizerTest, DragWindowController);
   FRIEND_TEST_ALL_PREFIXES(DragWindowResizerTest,
                            DragWindowControllerAcrossThreeDisplays);
-  // Creates DragWindowResizer that adds the ability of dragging windows across
-  // displays to |next_window_resizer|. This object takes the ownership of
-  // |next_window_resizer|.
-  explicit DragWindowResizer(WindowResizer* next_window_resizer,
-                             wm::WindowState* window_state);
 
   // Updates the bounds of the drag window for window dragging.
   void UpdateDragWindow(const gfx::Rect& bounds_in_parent,
diff --git a/ash/wm/tablet_mode/tablet_mode_event_handler_classic.h b/ash/wm/tablet_mode/tablet_mode_event_handler_classic.h
index 0444009b..929e523 100644
--- a/ash/wm/tablet_mode/tablet_mode_event_handler_classic.h
+++ b/ash/wm/tablet_mode/tablet_mode_event_handler_classic.h
@@ -13,6 +13,8 @@
 namespace wm {
 
 // Implementation of TabletModeEventHandler for aura. Uses ui::EventHandler.
+// TODO(jamescook): Collapse with TabletModeEventHandler.
+// https://crbug.com/866523
 class ASH_EXPORT TabletModeEventHandlerClassic : public TabletModeEventHandler,
                                                  public ui::EventHandler {
  public:
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager.cc b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
index e80bb67..06863a8 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
@@ -10,12 +10,11 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
-#include "ash/shell_port.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/overview/window_selector_controller.h"
 #include "ash/wm/tablet_mode/scoped_skip_user_session_blocked_check.h"
 #include "ash/wm/tablet_mode/tablet_mode_backdrop_delegate_impl.h"
-#include "ash/wm/tablet_mode/tablet_mode_event_handler.h"
+#include "ash/wm/tablet_mode/tablet_mode_event_handler_classic.h"
 #include "ash/wm/tablet_mode/tablet_mode_window_state.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_event.h"
@@ -249,7 +248,7 @@
   display::Screen::GetScreen()->AddObserver(this);
   Shell::Get()->AddShellObserver(this);
   Shell::Get()->split_view_controller()->AddObserver(this);
-  event_handler_ = ShellPort::Get()->CreateTabletModeEventHandler();
+  event_handler_ = std::make_unique<wm::TabletModeEventHandlerClassic>();
 }
 
 void TabletModeWindowManager::MaximizeAllWindows() {
diff --git a/ash/wm/window_cycle_controller.cc b/ash/wm/window_cycle_controller.cc
index 2e8caa32..f16a9a2 100644
--- a/ash/wm/window_cycle_controller.cc
+++ b/ash/wm/window_cycle_controller.cc
@@ -10,10 +10,9 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
-#include "ash/shell_port.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/screen_pinning_controller.h"
-#include "ash/wm/window_cycle_event_filter.h"
+#include "ash/wm/window_cycle_event_filter_classic.h"
 #include "ash/wm/window_cycle_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
@@ -62,7 +61,7 @@
   active_window_before_window_cycle_ = GetActiveWindow(window_list);
 
   window_cycle_list_.reset(new WindowCycleList(window_list));
-  event_filter_ = ShellPort::Get()->CreateWindowCycleEventFilter();
+  event_filter_ = std::make_unique<WindowCycleEventFilterClassic>();
   cycle_start_time_ = base::Time::Now();
   base::RecordAction(base::UserMetricsAction("WindowCycleController_Cycle"));
   UMA_HISTOGRAM_COUNTS_100("Ash.WindowCycleController.Items",
diff --git a/ash/wm/window_cycle_event_filter_classic.h b/ash/wm/window_cycle_event_filter_classic.h
index 7cedcdf..6dc03bb 100644
--- a/ash/wm/window_cycle_event_filter_classic.h
+++ b/ash/wm/window_cycle_event_filter_classic.h
@@ -13,6 +13,8 @@
 
 namespace ash {
 
+// TODO(jamescook): Collapse with WindowCycleEventFilter.
+// https://crbug.com/866523
 class ASH_EXPORT WindowCycleEventFilterClassic : public ui::EventHandler,
                                                  public WindowCycleEventFilter {
  public:
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc
index f25da61..25370fcc 100644
--- a/ash/wm/workspace/workspace_window_resizer.cc
+++ b/ash/wm/workspace/workspace_window_resizer.cc
@@ -14,8 +14,8 @@
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/shell.h"
-#include "ash/shell_port.h"
 #include "ash/wm/default_window_resizer.h"
+#include "ash/wm/drag_window_resizer.h"
 #include "ash/wm/panels/panel_window_resizer.h"
 #include "ash/wm/tablet_mode/tablet_mode_browser_window_drag_controller.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
@@ -76,7 +76,7 @@
     window_state->CreateDragDetails(point_in_parent, window_component, source);
     window_resizer =
         std::make_unique<TabletModeBrowserWindowDragController>(window_state);
-    window_resizer = ShellPort::Get()->CreateDragWindowResizer(
+    window_resizer = std::make_unique<DragWindowResizer>(
         std::move(window_resizer), window_state);
     return window_resizer;
   }
@@ -101,7 +101,7 @@
   } else {
     window_resizer.reset(DefaultWindowResizer::Create(window_state));
   }
-  window_resizer = ShellPort::Get()->CreateDragWindowResizer(
+  window_resizer = std::make_unique<DragWindowResizer>(
       std::move(window_resizer), window_state);
   if (window->type() == aura::client::WINDOW_TYPE_PANEL) {
     window_resizer.reset(
diff --git a/ash/wm/workspace_controller.cc b/ash/wm/workspace_controller.cc
index e127c8d..bb72fff6 100644
--- a/ash/wm/workspace_controller.cc
+++ b/ash/wm/workspace_controller.cc
@@ -10,14 +10,13 @@
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shell.h"
-#include "ash/shell_port.h"
 #include "ash/wm/fullscreen_window_finder.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_window_animations.h"
 #include "ash/wm/workspace/backdrop_controller.h"
 #include "ash/wm/workspace/backdrop_delegate.h"
-#include "ash/wm/workspace/workspace_event_handler.h"
+#include "ash/wm/workspace/workspace_event_handler_classic.h"
 #include "ash/wm/workspace/workspace_layout_manager.h"
 #include "ui/aura/window.h"
 #include "ui/compositor/layer.h"
@@ -38,7 +37,7 @@
 
 WorkspaceController::WorkspaceController(aura::Window* viewport)
     : viewport_(viewport),
-      event_handler_(ShellPort::Get()->CreateWorkspaceEventHandler(viewport)),
+      event_handler_(std::make_unique<WorkspaceEventHandlerClassic>(viewport)),
       layout_manager_(new WorkspaceLayoutManager(viewport)) {
   viewport_->AddObserver(this);
   ::wm::SetWindowVisibilityAnimationTransition(viewport_, ::wm::ANIMATE_NONE);
diff --git a/base/BUILD.gn b/base/BUILD.gn
index ee31993..1163271 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -29,6 +29,7 @@
 import("//build/config/sysroot.gni")
 import("//build/config/ui.gni")
 import("//build/nocompile.gni")
+import("//build/util/lastchange.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 import("//testing/test.gni")
 
@@ -2737,7 +2738,7 @@
 
   # Force recalculation if there's been a change.
   inputs = [
-    "//build/util/LASTCHANGE",
+    lastchange_file,
   ]
   outputs = [
     "$target_gen_dir/generated_build_date.h",
diff --git a/base/allocator/BUILD.gn b/base/allocator/BUILD.gn
index 5f1f7a1f..bc15d8b 100644
--- a/base/allocator/BUILD.gn
+++ b/base/allocator/BUILD.gn
@@ -185,6 +185,15 @@
       #"win_allocator.cc",
     ]
 
+    # Account for file changes in the new tcmalloc version.
+    if (use_new_tcmalloc) {
+      sources -= [ "$tcmalloc_dir/src/base/cycleclock.h" ]
+      sources += [
+        "$tcmalloc_dir/src/emergency_malloc_for_stacktrace.cc",
+        "$tcmalloc_dir/src/fake_stacktrace_scope.cc",
+      ]
+    }
+
     # Not included on mips64el.
     if (current_cpu == "mips64el") {
       sources -= [
diff --git a/base/trace_event/cfi_backtrace_android.cc b/base/trace_event/cfi_backtrace_android.cc
index 8fd8b955..76837aa 100644
--- a/base/trace_event/cfi_backtrace_android.cc
+++ b/base/trace_event/cfi_backtrace_android.cc
@@ -57,7 +57,15 @@
 */
 
 extern "C" {
+
+// The address of |__executable_start| gives the start address of the
+// executable or shared library. This value is used to find the offset address
+// of the instruction in binary from PC.
 extern char __executable_start;
+
+// The address |_etext| gives the end of the .text section in the binary. This
+// value is more accurate than parsing the memory map since the mapped
+// regions are usualy larger than the .text section.
 extern char _etext;
 }
 
@@ -119,6 +127,16 @@
   return instance;
 }
 
+// static
+uintptr_t CFIBacktraceAndroid::executable_start_addr() {
+  return reinterpret_cast<uintptr_t>(&__executable_start);
+}
+
+// static
+uintptr_t CFIBacktraceAndroid::executable_end_addr() {
+  return reinterpret_cast<uintptr_t>(&_etext);
+}
+
 CFIBacktraceAndroid::CFIBacktraceAndroid()
     : thread_local_cfi_cache_(
           [](void* ptr) { delete static_cast<CFICache*>(ptr); }) {
@@ -128,15 +146,6 @@
 CFIBacktraceAndroid::~CFIBacktraceAndroid() {}
 
 void CFIBacktraceAndroid::Initialize() {
-  // The address |_etext| gives the end of the .text section in the binary. This
-  // value is more accurate than parsing the memory map since the mapped
-  // regions are usualy larger than the .text section.
-  executable_end_addr_ = reinterpret_cast<uintptr_t>(&_etext);
-  // The address of |__executable_start| gives the start address of the
-  // executable. This value is used to find the offset address of the
-  // instruction in binary from PC.
-  executable_start_addr_ = reinterpret_cast<uintptr_t>(&__executable_start);
-
   // This file name is defined by extract_unwind_tables.gni.
   static constexpr char kCfiFileName[] = "assets/unwind_cfi_32";
   MemoryMappedFile::Region cfi_region;
@@ -188,13 +197,22 @@
   asm volatile("mov %0, pc" : "=r"(pc));
   asm volatile("mov %0, sp" : "=r"(sp));
 
+  return Unwind(pc, sp, out_trace, max_depth);
+}
+
+size_t CFIBacktraceAndroid::Unwind(uintptr_t pc,
+                                   uintptr_t sp,
+                                   const void** out_trace,
+                                   size_t max_depth) {
+  if (!can_unwind_stack_frames())
+    return 0;
+
   // We can only unwind as long as the pc is within the chrome.so.
   size_t depth = 0;
-  while (pc > executable_start_addr_ && pc <= executable_end_addr_ &&
-         depth < max_depth) {
+  while (is_chrome_address(pc) && depth < max_depth) {
     out_trace[depth++] = reinterpret_cast<void*>(pc);
     // The offset of function from the start of the chrome.so binary:
-    uintptr_t func_addr = pc - executable_start_addr_;
+    uintptr_t func_addr = pc - executable_start_addr();
     CFIRow cfi{};
     if (!FindCFIRowForPC(func_addr, &cfi))
       break;
@@ -209,8 +227,15 @@
   return depth;
 }
 
+void CFIBacktraceAndroid::AllocateCacheForCurrentThread() {
+  GetThreadLocalCFICache();
+}
+
 bool CFIBacktraceAndroid::FindCFIRowForPC(uintptr_t func_addr,
                                           CFIBacktraceAndroid::CFIRow* cfi) {
+  if (!can_unwind_stack_frames())
+    return false;
+
   auto* cache = GetThreadLocalCFICache();
   *cfi = {0};
   if (cache->Find(func_addr, cfi))
diff --git a/base/trace_event/cfi_backtrace_android.h b/base/trace_event/cfi_backtrace_android.h
index 0c513321..3278122e 100644
--- a/base/trace_event/cfi_backtrace_android.h
+++ b/base/trace_event/cfi_backtrace_android.h
@@ -35,6 +35,15 @@
   // on first call.
   static CFIBacktraceAndroid* GetInitializedInstance();
 
+  // Returns true if the given program counter |pc| is mapped in chrome library.
+  static bool is_chrome_address(uintptr_t pc) {
+    return pc >= executable_start_addr() && pc < executable_end_addr();
+  }
+
+  // Returns the start and end address of the current library.
+  static uintptr_t executable_start_addr();
+  static uintptr_t executable_end_addr();
+
   // Returns true if stack unwinding is possible using CFI unwind tables in apk.
   // There is no need to check this before each unwind call. Will always return
   // the same value based on CFI tables being present in the binary.
@@ -43,18 +52,28 @@
   // Returns the program counters by unwinding stack in the current thread in
   // order of latest call frame first. Unwinding works only if
   // can_unwind_stack_frames() returns true. This function allocates memory from
-  // heap for caches. For each stack frame, this method searches through the
-  // unwind table mapped in memory to find the unwind information for function
-  // and walks the stack to find all the return address. This only works until
-  // the last function call from the chrome.so. We do not have unwind
-  // information to unwind beyond any frame outside of chrome.so. Calls to
-  // Unwind() are thread safe and lock free, once Initialize() returns success.
+  // heap for cache on the first call of the calling thread, unless
+  // AllocateCacheForCurrentThread() is called from the thread. For each stack
+  // frame, this method searches through the unwind table mapped in memory to
+  // find the unwind information for function and walks the stack to find all
+  // the return address. This only works until the last function call from the
+  // chrome.so. We do not have unwind information to unwind beyond any frame
+  // outside of chrome.so. Calls to Unwind() are thread safe and lock free, once
+  // Initialize() returns success.
   size_t Unwind(const void** out_trace, size_t max_depth);
 
- private:
-  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestCFICache);
-  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestFindCFIRow);
-  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestUnwinding);
+  // Same as above function, but starts from a given program counter |pc| and
+  // stack pointer |sp|. This can be from current thread or any other thread.
+  // But the caller must make sure that the thread's stack segment is not racy
+  // to read.
+  size_t Unwind(uintptr_t pc,
+                uintptr_t sp,
+                const void** out_trace,
+                size_t max_depth);
+
+  // Allocates memory for CFI cache for the current thread so that Unwind()
+  // calls are safe for signal handlers.
+  void AllocateCacheForCurrentThread();
 
   // The CFI information that correspond to an instruction.
   struct CFIRow {
@@ -71,6 +90,15 @@
     uint16_t ra_offset = 0;
   };
 
+  // Finds the CFI row for the given |func_addr| in terms of offset from
+  // the start of the current binary. Concurrent calls are thread safe.
+  bool FindCFIRowForPC(uintptr_t func_addr, CFIRow* out);
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestCFICache);
+  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestFindCFIRow);
+  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestUnwinding);
+
   // A simple cache that stores entries in table using prime modulo hashing.
   // This cache with 500 entries already gives us 95% hit rate, and fits in a
   // single system page (usually 4KiB). Using a thread local cache for each
@@ -118,17 +146,8 @@
   // Finds the UNW_INDEX and UNW_DATA tables in from the CFI file memory map.
   void ParseCFITables();
 
-  // Finds the CFI row for the given |func_addr| in terms of offset from
-  // the start of the current binary.
-  bool FindCFIRowForPC(uintptr_t func_addr, CFIRow* out);
-
   CFICache* GetThreadLocalCFICache();
 
-  // Details about the memory mapped region which contains the libchrome.so
-  // library file.
-  uintptr_t executable_start_addr_ = 0;
-  uintptr_t executable_end_addr_ = 0;
-
   // The start address of the memory mapped unwind table asset file. Unique ptr
   // because it is replaced in tests.
   std::unique_ptr<MemoryMappedFile> cfi_mmap_;
diff --git a/base/trace_event/cfi_backtrace_android_unittest.cc b/base/trace_event/cfi_backtrace_android_unittest.cc
index 3ad3d330..fdca674 100644
--- a/base/trace_event/cfi_backtrace_android_unittest.cc
+++ b/base/trace_event/cfi_backtrace_android_unittest.cc
@@ -21,8 +21,8 @@
 TEST(CFIBacktraceAndroidTest, TestUnwinding) {
   auto* unwinder = CFIBacktraceAndroid::GetInitializedInstance();
   EXPECT_TRUE(unwinder->can_unwind_stack_frames());
-  EXPECT_GT(unwinder->executable_start_addr_, 0u);
-  EXPECT_GT(unwinder->executable_end_addr_, unwinder->executable_start_addr_);
+  EXPECT_GT(unwinder->executable_start_addr(), 0u);
+  EXPECT_GT(unwinder->executable_end_addr(), unwinder->executable_start_addr());
   EXPECT_GT(unwinder->cfi_mmap_->length(), 0u);
 
   const size_t kMaxFrames = 100;
@@ -39,9 +39,9 @@
 
   for (size_t i = 0; i < unwind_count; ++i) {
     EXPECT_GT(reinterpret_cast<uintptr_t>(frames[i]),
-              unwinder->executable_start_addr_);
+              unwinder->executable_start_addr());
     EXPECT_LT(reinterpret_cast<uintptr_t>(frames[i]),
-              unwinder->executable_end_addr_);
+              unwinder->executable_end_addr());
   }
 }
 
diff --git a/build/.gitignore b/build/.gitignore
index bd3703c..62fc733 100644
--- a/build/.gitignore
+++ b/build/.gitignore
@@ -21,3 +21,4 @@
 /ios_files
 /mac_files
 
+!/util/LASTCHANGE.dummy
diff --git a/build/fuchsia/sdk.sha1 b/build/fuchsia/sdk.sha1
index e8b9ca0..56b4d8a 100644
--- a/build/fuchsia/sdk.sha1
+++ b/build/fuchsia/sdk.sha1
@@ -1 +1 @@
-be1455d02b09799d1150be98feab598f91f00200
\ No newline at end of file
+82ecb22144b0d1a43d942160aa4ff723bf5857da
\ No newline at end of file
diff --git a/build/mac/tweak_info_plist.gni b/build/mac/tweak_info_plist.gni
index 505f5e5..9f4cbb3 100644
--- a/build/mac/tweak_info_plist.gni
+++ b/build/mac/tweak_info_plist.gni
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/util/lastchange.gni")
+
 # Template to run the tweak_info_plist.py script on a plist.
 #
 # Arguments:
@@ -59,7 +61,7 @@
     inputs = [
       script,
       "//build/util/version.py",
-      "//build/util/LASTCHANGE",
+      lastchange_file,
       "//chrome/VERSION",
     ]
     sources = [
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index b6f63d7..9a496442 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -151,7 +151,9 @@
     # toolchain args, use those values, otherwise default to the global one.
     # This works because the only reasonable override that toolchains might
     # supply for these values are to force-disable them.
-    if (toolchain_uses_goma) {
+    # But if has_gomacc_path is set, we assumes that compiler wrapper find
+    # gomacc from GOMACC_PATH envvar.
+    if (toolchain_uses_goma && !has_gomacc_path) {
       goma_path = "$goma_dir/gomacc"
 
       # Use the static analysis script if static analysis is turned on
diff --git a/build/toolchain/goma.gni b/build/toolchain/goma.gni
index 29be588f..0e1d815 100644
--- a/build/toolchain/goma.gni
+++ b/build/toolchain/goma.gni
@@ -8,6 +8,11 @@
   # Set to true to enable distributed compilation using Goma.
   use_goma = false
 
+  # This flag is for ChromeOS compiler wrapper.
+  # By passing gomacc path via GOMACC_PATH environment variable, ChromeOS'
+  # compiler wrapper invokes gomacc inside it.
+  has_gomacc_path = false
+
   # Set the default value based on the platform.
   if (host_os == "win") {
     # Absolute directory containing the gomacc.exe binary.
diff --git a/build/util/BUILD.gn b/build/util/BUILD.gn
index 9f5a6f71..54c23c91 100644
--- a/build/util/BUILD.gn
+++ b/build/util/BUILD.gn
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/util/lastchange.gni")
+
 action("webkit_version") {
   script = "version.py"
 
-  lastchange_file = "LASTCHANGE"
-
   template_file = "webkit_version.h.in"
   inputs = [
     lastchange_file,
diff --git a/build/util/LASTCHANGE.dummy b/build/util/LASTCHANGE.dummy
new file mode 100644
index 0000000..87b43a9
--- /dev/null
+++ b/build/util/LASTCHANGE.dummy
@@ -0,0 +1 @@
+LASTCHANGE=thisisdummylastchange-thisisdummylastchange
diff --git a/build/util/lastchange.gni b/build/util/lastchange.gni
new file mode 100644
index 0000000..a132959
--- /dev/null
+++ b/build/util/lastchange.gni
@@ -0,0 +1,16 @@
+# 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 is used to inject fixed dummy commit for commit independent
+# reproducible binaries.
+
+declare_args() {
+  use_dummy_lastchange = false
+}
+
+if (use_dummy_lastchange) {
+  lastchange_file = "//build/util/LASTCHANGE.dummy"
+} else {
+  lastchange_file = "//build/util/LASTCHANGE"
+}
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
index cf75f39..d4eb747 100644
--- a/cc/paint/paint_op_reader.cc
+++ b/cc/paint/paint_op_reader.cc
@@ -388,7 +388,7 @@
   procs.fTypefaceCtx = &typeface_ctx;
   sk_sp<SkTextBlob> blob = SkTextBlob::Deserialize(
       const_cast<const char*>(memory_), data_bytes, procs);
-  if (typeface_ctx.invalid_typeface) {
+  if (!blob || typeface_ctx.invalid_typeface) {
     SetInvalid();
     return;
   }
diff --git a/cc/test/render_pass_test_utils.cc b/cc/test/render_pass_test_utils.cc
index cf808ef1..e1f83fa 100644
--- a/cc/test/render_pass_test_utils.cc
+++ b/cc/test/render_pass_test_utils.cc
@@ -316,7 +316,7 @@
 
   std::vector<viz::ReturnedResource> returned_to_child;
   int child_id = resource_provider->CreateChild(
-      base::Bind(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
 
   // Transfer resource to the parent.
   std::vector<viz::TransferableResource> list;
diff --git a/cc/test/resource_provider_test_utils.cc b/cc/test/resource_provider_test_utils.cc
index fa1b4aa5..7a024f9 100644
--- a/cc/test/resource_provider_test_utils.cc
+++ b/cc/test/resource_provider_test_utils.cc
@@ -19,7 +19,8 @@
   // Transfer resources to the parent.
   std::vector<viz::TransferableResource> send_to_parent;
   int child_id = resource_provider->CreateChild(
-      base::BindRepeating([](const std::vector<viz::ReturnedResource>&) {}));
+      base::BindRepeating([](const std::vector<viz::ReturnedResource>&) {}),
+      true);
   child_resource_provider->PrepareSendToParent(resource_ids, &send_to_parent,
                                                child_context_provider);
   resource_provider->ReceiveFromChild(child_id, send_to_parent);
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index a4c03f7..a8243db9 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -16,6 +16,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
+#include "build/build_config.h"
 #include "cc/base/devtools_instrumentation.h"
 #include "cc/base/histograms.h"
 #include "cc/paint/image_transfer_cache_entry.h"
@@ -129,6 +130,12 @@
 // Determines whether a draw image requires mips.
 bool ShouldGenerateMips(const DrawImage& draw_image,
                         int upload_scale_mip_level) {
+#if defined(OS_WIN)
+  // TODO(ericrk): Temporarily disable to investigate memory regression on
+  // Windows. https://crbug.com/867468
+  return false;
+#endif  // defined(OS_WIN)
+
   // If filter quality is less than medium, don't generate mips.
   if (draw_image.filter_quality() < kMedium_SkFilterQuality)
     return false;
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc
index 46c9f9c..a1c21a6 100644
--- a/cc/tiles/gpu_image_decode_cache_unittest.cc
+++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "build/build_config.h"
 #include "cc/paint/draw_image.h"
 #include "cc/paint/image_transfer_cache_entry.h"
 #include "cc/paint/paint_image_builder.h"
@@ -2475,6 +2476,12 @@
 }
 
 TEST_P(GpuImageDecodeCacheTest, BasicMips) {
+#if defined(OS_WIN)
+  // TODO(ericrk): Mips are temporarily disabled to investigate a memory
+  // regression on Windows. https://crbug.com/867468
+  return;
+#endif  // defined(OS_WIN)
+
   auto decode_and_check_mips = [this](SkFilterQuality filter_quality,
                                       SkSize scale, gfx::ColorSpace color_space,
                                       bool should_have_mips) {
@@ -2534,6 +2541,12 @@
 }
 
 TEST_P(GpuImageDecodeCacheTest, MipsAddedSubsequentDraw) {
+#if defined(OS_WIN)
+  // TODO(ericrk): Mips are temporarily disabled to investigate a memory
+  // regression on Windows. https://crbug.com/867468
+  return;
+#endif  // defined(OS_WIN)
+
   auto cache = CreateCache();
   bool is_decomposable = true;
   auto filter_quality = kMedium_SkFilterQuality;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index ea97ee9e..a9b3094a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -247,6 +247,7 @@
             "OfflinePagesDescriptiveFailStatus";
     public static final String OFFLINE_PAGES_DESCRIPTIVE_PENDING_STATUS =
             "OfflinePagesDescriptivePendingStatus";
+    public static final String OFFLINE_PAGES_PREFETCHING = "OfflinePagesPrefetching";
     public static final String OMNIBOX_HIDE_SCHEME_DOMAIN_IN_STEADY_STATE =
             "OmniboxUIExperimentHideSteadyStateUrlSchemeAndSubdomains";
     public static final String OMNIBOX_SPARE_RENDERER = "OmniboxSpareRenderer";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
index 60e13c8..ff95a6be 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
@@ -70,7 +70,7 @@
                 }
                 return secureRandom;
             }
-        }.execute();
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java
new file mode 100644
index 0000000..8bc01f3
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java
@@ -0,0 +1,127 @@
+// 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.
+
+package org.chromium.chrome.browser.media.router;
+
+import com.google.android.gms.cast.MediaInfo;
+import com.google.android.gms.cast.MediaMetadata;
+import com.google.android.gms.cast.MediaStatus;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+
+/**
+ * Wrapper layer that exposes a gms.cast.MediaStatus to native code.
+ * See also media/base/media_status.h.
+ */
+@JNINamespace("media_router")
+public class MediaStatusBridge {
+    private MediaStatus mStatus;
+
+    public MediaStatusBridge(MediaStatus status) {
+        mStatus = status;
+    }
+
+    /**
+     * Gets the play state of the stream. Return values are defined as such:
+     * - PLAYER_STATE_UNKOWN = 0
+     * - PLAYER_STATE_IDLE = 1
+     * - PLAYER_STATE_PLAYING = 2
+     * - PLAYER_STATE_PAUSED = 3
+     * - PLAYER_STATE_BUFFERING = 4
+     * See https://developers.google.com/android/reference/com/google/android/gms/cast/MediaStatus
+     */
+    @CalledByNative
+    public int playerState() {
+        return mStatus.getPlayerState();
+    }
+
+    /**
+     * The main title of the media. For example, in a MediaStatus representing
+     * a YouTube Cast session, this could be the title of the video.
+     */
+    @CalledByNative
+    public String title() {
+        MediaInfo info = mStatus.getMediaInfo();
+        if(info == null)
+            return "";
+
+        MediaMetadata metadata = info.getMetadata();
+        if(metadata == null)
+            return "";
+
+        return metadata.getString(MediaMetadata.KEY_TITLE);
+    }
+
+    /**
+     * If this is true, the media can be played and paused.
+     */
+    @CalledByNative
+    public boolean canPlayPause() {
+        return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_PAUSE);
+    }
+
+    /**
+     * If this is true, the media can be muted and unmuted.
+     */
+    @CalledByNative
+    public boolean canMute() {
+        return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_TOGGLE_MUTE);
+    }
+
+    /**
+     * If this is true, the media's volume can be changed.
+     */
+    @CalledByNative
+    public boolean canSetVolume() {
+        return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_SET_VOLUME);
+    }
+
+    /**
+     * If this is true, the media's current playback position can be chaxnged.
+     */
+    @CalledByNative
+    public boolean canSeek() {
+        return mStatus.isMediaCommandSupported(MediaStatus.COMMAND_SEEK);
+    }
+
+    /**
+     * Returns the stream's mute state.
+     */
+    @CalledByNative
+    public boolean isMuted() {
+        return mStatus.isMute();
+    }
+
+    /**
+     * Current volume of the media, with 1 being the highest and 0 being the
+     * lowest/no sound. When |is_muted| is true, there should be no sound
+     * regardless of |volume|.
+     */
+    @CalledByNative
+    public double volume() {
+        return mStatus.getStreamVolume();
+    }
+
+    /**
+     * The length of the media, in ms. A value of zero indicates that this is a media
+     * with no set duration (e.g. a live stream).
+     */
+    @CalledByNative
+    public long duration() {
+        MediaInfo info = mStatus.getMediaInfo();
+        if(info == null)
+            return 0;
+
+        return info.getStreamDuration();
+    }
+
+    /**
+     * Current playback position, in ms. Must be less than or equal to |duration|.
+     */
+    @CalledByNative
+    public long currentTime() {
+        return mStatus.getStreamPosition();
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaStatusObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaStatusObserver.java
new file mode 100644
index 0000000..6ccb9bc6f
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaStatusObserver.java
@@ -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.
+
+package org.chromium.chrome.browser.media.router;
+
+/**
+ * Interface to subscribe to MediaStatus updates.
+ */
+public interface MediaStatusObserver {
+    /**
+     * Called when there is a MediaStatus update.
+     * NOTE: At the moment, FlingingControllerBridge is the only implementer. Sending a
+     * MediaStatusBridge directly reduces boilerplate code. If a second implementer
+     * were added, adding a ChromeMediaStatus interface and using here instead might
+     * make more sense.
+     */
+    public void onMediaStatusUpdate(MediaStatusBridge status);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
new file mode 100644
index 0000000..ad68243
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
@@ -0,0 +1,44 @@
+// 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.
+
+package org.chromium.chrome.browser.offlinepages.prefetch;
+
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.profiles.Profile;
+
+/**
+ * Allows the querying and setting of Offline Prefetch related configurations.
+ */
+@JNINamespace("offline_pages::android")
+public class PrefetchConfiguration {
+    /**
+     * Returns true if the Offline Prefetch feature flag is enabled. This can be used to determine
+     * if any evidence of this feature should be presented to the user (like its respective user
+     * settings entries).
+     */
+    public static boolean isPrefetchingFlagEnabled() {
+        return ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_PAGES_PREFETCHING);
+    }
+
+    /**
+     * Returns true if Offline Prefetch is allowed to run, requiring both the feature flag and the
+     * user setting to be true. If the current browser Profile is null this method returns false.
+     */
+    public static boolean isPrefetchingEnabled() {
+        return nativeIsPrefetchingEnabled(Profile.getLastUsedProfile());
+    }
+
+    /**
+     * Sets the value of the user controlled setting that controls whether Offline Prefetch is
+     * enabled or disabled. If the current browser Profile is null the setting will not be changed.
+     */
+    public static void setPrefetchingEnabledInSettings(boolean enabled) {
+        nativeSetPrefetchingEnabledInSettings(Profile.getLastUsedProfile(), enabled);
+    }
+
+    private static native boolean nativeIsPrefetchingEnabled(Profile profile);
+    private static native void nativeSetPrefetchingEnabledInSettings(
+            Profile profile, boolean enabled);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/MostVisitedSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/MostVisitedSitesBridge.java
index 501074db..b30a92a9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/MostVisitedSitesBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/MostVisitedSitesBridge.java
@@ -12,7 +12,6 @@
 import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.util.FeatureUtilities;
-import org.chromium.chrome.browser.util.UrlUtilities;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -50,7 +49,6 @@
                 public boolean isHomepageTileEnabled() {
                     return HomepageManager.isHomepageEnabled()
                             && !NewTabPage.isNTPUrl(getHomepageUrl())
-                            && !UrlUtilities.nativeIsGoogleHomePageUrl(getHomepageUrl())
                             && !TextUtils.isEmpty(HomepageManager.getHomepageUri());
                 }
 
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 770ba1b..b07df31 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -130,6 +130,7 @@
 <translation id="1989112275319619282">مشاهده محتوای موجود در فروشگاه ما</translation>
 <translation id="1993768208584545658"><ph name="SITE" /> می‌خواهد مرتبط شود</translation>
 <translation id="1994173015038366702">نشانی وب سایت</translation>
+<translation id="2000419248597011803">برخی کوکی‌ها و جستجوها را از نوار نشانی و جعبه جستجو به موتور جستجوی پیش‌فرض ارسال می‌کند</translation>
 <translation id="2002537628803770967">‏کارت‌های اعتباری و نشانی‌های مورداستفاده در Google Pay</translation>
 <translation id="200815880754187296"><ph name="KILOBYTES" /> کیلوبایت توسط سایر برنامه‌ها</translation>
 <translation id="2017836877785168846">سابقه و تکمیل خودکار را در نوار نشانی پاک می‌کند.</translation>
@@ -181,6 +182,7 @@
 <translation id="2387895666653383613">اندازه قلم نوشتار</translation>
 <translation id="2402980924095424747"><ph name="MEGABYTES" /> مگابایت</translation>
 <translation id="2410754283952462441">انتخاب حساب</translation>
+<translation id="2414672073755873541">محتوایی موجود نیست</translation>
 <translation id="2414886740292270097">تاریک</translation>
 <translation id="2416359993254398973">‏Chrome به مجوز دسترسی به دوربین برای این سایت نیاز دارد.</translation>
 <translation id="2426805022920575512">انتخاب حسابی دیگر</translation>
@@ -227,6 +229,7 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> ثانیه باقی‌مانده است</translation>
 <translation id="2781151931089541271">۱ ثانیه باقی‌مانده است</translation>
 <translation id="2810645512293415242">صفحه ساده‌شده برای ذخیره داده‌ها و بارگیری با سرعت بیشتر.</translation>
+<translation id="281504910091592009">‏در <ph name="BEGIN_LINK" />حساب Google<ph name="END_LINK" /> خود گذرواژه‌های ذخیره‌شده را مشاهده و مدیریت کنید</translation>
 <translation id="2818669890320396765">برای اینکه نشانک‌هایتان را در همه دستگاه‌ها داشته باشید، به سیستم وارد شوید و همگام‌سازی را روشن کنید</translation>
 <translation id="2836148919159985482">برای خروج از حالت تمام صفحه، دکمه برگشت را لمس کنید.</translation>
 <translation id="2842985007712546952">پوشه اصلی</translation>
@@ -313,6 +316,7 @@
 <translation id="360207483134687714">‏به بهبود تجربه «واقعیت مجازی» در Chrome کمک کنید</translation>
 <translation id="3616113530831147358">صوتی</translation>
 <translation id="3620176948598597475">بازنشانی، سابقه صرفه‌جویی داده (ازجمله فهرست سایت‌های بازدید شده) را پاک می‌کند.</translation>
+<translation id="3630011985153972676">‏در بخش تنظیمات، به Chrome اجازه دهید هنگام اتصال به Wi-Fi برایتان مقاله بارگیری کند.</translation>
 <translation id="3632295766818638029">نمایش گذرواژه</translation>
 <translation id="363596933471559332">با استفاده از اعتبارنامه‌های ذخیره شده، به‌طور خودکار به سیستم وب‌سایت‌ها وارد شوید. وقتی این قابلیت خاموش است، هر بار قبل از وارد شدن به سیستم وب‌سایت از شما خواسته می‌شود اطلاعات را تأیید کنید.</translation>
 <translation id="3661699943263275414">وب‌سایت‌های طرف ثالث می‌توانند داده‌های کوکی را ذخیره کنند و بخوانند</translation>
@@ -517,6 +521,7 @@
 <translation id="5335288049665977812">مجاز کردن همه سایت‌ها برای اجرای جاوااسکریپت (توصیه‌ می‌شود)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> حذف شد</translation>
 <translation id="5372829067651257087">نشانی وب کپی شد.</translation>
+<translation id="5391532827096253100">اتصال شما به این سایت امن نیست. اطلاعات سایت</translation>
 <translation id="5400569084694353794">‏استفاده از این برنامه به معنای اعلام موافقت شما با <ph name="BEGIN_LINK1" />شرایط خدمات<ph name="END_LINK1" /> و <ph name="BEGIN_LINK2" />اعلامیه حریم خصوصی<ph name="END_LINK2" /> Chrome است.</translation>
 <translation id="5403644198645076998">فقط بعضی از سایت‌ها مجاز هستند</translation>
 <translation id="5414836363063783498">در حال تأیید...</translation>
@@ -584,6 +589,7 @@
 <translation id="5809361687334836369">{HOURS,plural, =1{۱ ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}}</translation>
 <translation id="5817918615728894473">مرتبط‌سازی</translation>
 <translation id="583281660410589416">ناشناس</translation>
+<translation id="5833397272224757657">از محتوای سایت‌هایی که بازدید می‌کنید و فعالیت و تعاملات مرورگر برای شخصی‌سازی استفاده می‌کند</translation>
 <translation id="5833984609253377421">اشتراک‌گذاری پیوند</translation>
 <translation id="5854790677617711513">قدیمی‌تر از ۳۰ روز</translation>
 <translation id="5858741533101922242">‏Chrome قادر به روشن کردن آداپتور بلوتوث نیست</translation>
@@ -629,6 +635,7 @@
 <translation id="618555311922999635">پانل پیمایش کاملاً باز شد</translation>
 <translation id="6192333916571137726">فایل بارگیری</translation>
 <translation id="6192792657125177640">موارد استثنا</translation>
+<translation id="6206551242102657620">اتصال امن است. اطلاعات سایت</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> ایمیل شما نیست؟</translation>
 <translation id="6216432067784365534">گزینه‌های <ph name="NAME_OF_LIST_ITEM" /></translation>
 <translation id="6221633008163990886">برای صادر کردن گذرواژه‌ها، قفل را باز کنید</translation>
@@ -720,6 +727,7 @@
 <translation id="6914783257214138813">گذرواژه‌های شما برای همه افرادی که می‌توانند فایل صادرشده را ببینید، نمایان خواهند بود.</translation>
 <translation id="6942665639005891494">هرزمان بخواهید می‌توانید با استفاده از منوی «تنظیمات»، محل پیش‌فرض بارگیری را تغییر دهید</translation>
 <translation id="6945221475159498467">انتخاب</translation>
+<translation id="6963642900430330478">این صفحه خطرناک است. اطلاعات سایت</translation>
 <translation id="6963766334940102469">حذف نشانک‌ها</translation>
 <translation id="6965382102122355670">قبول</translation>
 <translation id="6978479750597523876">بازنشانی تنظیمات ترجمه</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 792c523..bd69fe7f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -130,6 +130,7 @@
 <translation id="1989112275319619282">Bla gjennom</translation>
 <translation id="1993768208584545658"><ph name="SITE" /> vil koble til</translation>
 <translation id="1994173015038366702">Nettadressen til nettstedet</translation>
+<translation id="2000419248597011803">Sender noen informasjonskapsler og søk fra adressefeltet og søkefeltet samt noen informasjonskapsler til standardsøkemotoren din</translation>
 <translation id="2002537628803770967">Kredittkort og adresser ved bruk av Google Pay</translation>
 <translation id="200815880754187296"><ph name="KILOBYTES" /> kB andre apper</translation>
 <translation id="2017836877785168846">Tømmer loggen og fjerner automatiske fullføringer fra adressefeltet.</translation>
@@ -181,6 +182,7 @@
 <translation id="2387895666653383613">Tekstskalering</translation>
 <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation>
 <translation id="2410754283952462441">Velg en konto</translation>
+<translation id="2414672073755873541">Ingen innhold her</translation>
 <translation id="2414886740292270097">Mørk</translation>
 <translation id="2416359993254398973">Chrome trenger tilgang til kameraet ditt for dette nettstedet.</translation>
 <translation id="2426805022920575512">Velg en annen konto</translation>
@@ -227,6 +229,7 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder igjen</translation>
 <translation id="2781151931089541271">1 sekund igjen</translation>
 <translation id="2810645512293415242">Siden er forenklet for å spare data og laste den inn raskere.</translation>
+<translation id="281504910091592009">Se og administrer lagrede passord i <ph name="BEGIN_LINK" />Google-kontoen<ph name="END_LINK" /> din</translation>
 <translation id="2818669890320396765">For å få bokmerkene dine på alle enhetene dine, logg på og slå på synkronisering</translation>
 <translation id="2836148919159985482">Trykk på tilbakeknappen for å avslutte fullskjerm.</translation>
 <translation id="2842985007712546952">Overordnet mappe</translation>
@@ -313,6 +316,7 @@
 <translation id="360207483134687714">Hjelp til med å forbedre VR-opplevelsen i Chrome</translation>
 <translation id="3616113530831147358">Lyd</translation>
 <translation id="3620176948598597475">Tilbakestilling gjør at datasparingsloggen tømmes, inkludert listen over besøkte nettsteder.</translation>
+<translation id="3630011985153972676">Lar Chrome laste ned artikler for deg når du er tilkoblet Wi-Fi under innstillinger.</translation>
 <translation id="3632295766818638029">Vis passordet</translation>
 <translation id="363596933471559332">Du logges på nettsteder automatisk ved hjelp av lagret legitimasjon. Når funksjonen er slått av, blir du bedt om å oppgi legitimasjonen din hver gang du logger på et nettsted.</translation>
 <translation id="3661699943263275414">Tredjepartsnettsteder kan lagre og lese data i informasjonskapsler.</translation>
@@ -517,6 +521,7 @@
 <translation id="5335288049665977812">Tillat nettsteder å kjøre JavaScript (anbefales)</translation>
 <translation id="5345040418939504969">Slettet <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5372829067651257087">Nettadressen er kopiert.</translation>
+<translation id="5391532827096253100">Tilkoblingen til dette nettstedet er ikke sikker. Opplysninger om nettstedet</translation>
 <translation id="5400569084694353794">Ved å bruke dette programmet samtykker du i Chromes <ph name="BEGIN_LINK1" />vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />merknad om personvern<ph name="END_LINK2" />.</translation>
 <translation id="5403644198645076998">Tillat bare visse nettsteder</translation>
 <translation id="5414836363063783498">Bekrefter …</translation>
@@ -585,6 +590,7 @@
 <translation id="5809361687334836369">{HOURS,plural, =1{for # time siden}other{for # timer siden}}</translation>
 <translation id="5817918615728894473">Koble sammen</translation>
 <translation id="583281660410589416">Ukjent</translation>
+<translation id="5833397272224757657">Bruker innhold fra nettsteder du besøker, nettleseraktivitet og andre interaksjoner for å gi ting et personlig preg</translation>
 <translation id="5833984609253377421">Del en link</translation>
 <translation id="5854790677617711513">Eldre enn 30 dager</translation>
 <translation id="5858741533101922242">Chrome kan ikke slå på Bluetooth-adapteren</translation>
@@ -630,6 +636,7 @@
 <translation id="618555311922999635">Navigasjonspanelet 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. Opplysninger om nettstedet</translation>
 <translation id="6210748933810148297">Ikke <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534">Alternativer for <ph name="NAME_OF_LIST_ITEM" /></translation>
 <translation id="6221633008163990886">Lås opp for å eksportere passordene dine</translation>
@@ -721,6 +728,7 @@
 <translation id="6914783257214138813">Passordene dine blir synlige for alle som kan se den eksporterte filen.</translation>
 <translation id="6942665639005891494">Endre standard nedlastingssted når som helst via menyalternativet Innstillinger</translation>
 <translation id="6945221475159498467">Velg</translation>
+<translation id="6963642900430330478">Denne siden er farlig. Informasjon om nettstedet</translation>
 <translation id="6963766334940102469">Slett bokmerker</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6978479750597523876">Tilbakestill innstillingene for oversetting</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 05f41e0..2b49d1c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -130,6 +130,7 @@
 <translation id="1989112275319619282">Выбрать</translation>
 <translation id="1993768208584545658">Сайт <ph name="SITE" /> запрашивает подключение</translation>
 <translation id="1994173015038366702">Адрес сайта</translation>
+<translation id="2000419248597011803">Отправлять некоторые файлы cookie и поисковые запросы из адресной строки в поисковую систему по умолчанию</translation>
 <translation id="2002537628803770967">Кредитные карты и адреса из Google Pay</translation>
 <translation id="200815880754187296">Другие приложения: <ph name="KILOBYTES" /> КБ</translation>
 <translation id="2017836877785168846">Удаление истории и вариантов автозаполнения в адресной строке</translation>
@@ -181,6 +182,7 @@
 <translation id="2387895666653383613">Масштабирование текста</translation>
 <translation id="2402980924095424747"><ph name="MEGABYTES" /> МБ</translation>
 <translation id="2410754283952462441">Выберите аккаунт</translation>
+<translation id="2414672073755873541">Нет контента</translation>
 <translation id="2414886740292270097">Темный</translation>
 <translation id="2416359993254398973">Для этого сайта Chrome запрашивает разрешение на доступ к камере.</translation>
 <translation id="2426805022920575512">Сменить аккаунт</translation>
@@ -227,6 +229,7 @@
 <translation id="2777555524387840389">Осталось <ph name="SECONDS" /> сек.</translation>
 <translation id="2781151931089541271">Осталась 1 сек.</translation>
 <translation id="2810645512293415242">Страница была открыта в упрощенном виде, чтобы уменьшить объем трафика и время загрузки.</translation>
+<translation id="281504910091592009">Просматривайте сохраненные пароли и управляйте ими на странице <ph name="BEGIN_LINK" />Аккаунт Google<ph name="END_LINK" /></translation>
 <translation id="2818669890320396765">Чтобы получить доступ к закладкам на всех устройствах, войдите в аккаунт и включите синхронизацию.</translation>
 <translation id="2836148919159985482">Чтобы выйти из полноэкранного режима, нажмите кнопку "Назад".</translation>
 <translation id="2842985007712546952">Родительская папка</translation>
@@ -313,6 +316,7 @@
 <translation id="360207483134687714">Помогите улучшить VR-режим в Chrome</translation>
 <translation id="3616113530831147358">Аудио</translation>
 <translation id="3620176948598597475">Будет удалена информация о сэкономленном трафике, в том числе список просмотренных сайтов.</translation>
+<translation id="3630011985153972676">Перейдите в настройки и предоставьте Chrome разрешение скачивать статьи только по сети Wi-Fi.</translation>
 <translation id="3632295766818638029">Показать пароль</translation>
 <translation id="363596933471559332">Входить на веб-сайты с помощью сохраненного имени пользователя и пароля. Когда функция отключена, эти данные нужно указывать при каждом входе.</translation>
 <translation id="3661699943263275414">Сторонние веб-сайты могут сохранять и читать файлы cookie</translation>
@@ -517,6 +521,7 @@
 <translation id="5335288049665977812">Разрешить сайтам использовать JavaScript (рекомендуется)</translation>
 <translation id="5345040418939504969">Закладка "<ph name="BOOKMARK_TITLE" />" удалена</translation>
 <translation id="5372829067651257087">URL скопирован.</translation>
+<translation id="5391532827096253100">Подключение к сайту не защищено. Информация о сайте.</translation>
 <translation id="5400569084694353794">Работая с приложением, вы принимаете <ph name="BEGIN_LINK1" />Условия использования<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Примечание о конфиденциальности<ph name="END_LINK2" /> Chrome.</translation>
 <translation id="5403644198645076998">Разрешить доступ только к определенным сайтам</translation>
 <translation id="5414836363063783498">Проверка…</translation>
@@ -585,6 +590,7 @@
 <translation id="5809361687334836369">{HOURS,plural, =1{# час назад}one{# час назад}few{# часа назад}many{# часов назад}other{# часа назад}}</translation>
 <translation id="5817918615728894473">Подключить</translation>
 <translation id="583281660410589416">Неизвестно</translation>
+<translation id="5833397272224757657">Использовать для персонализации информацию с посещенных вами сайтов и данные о действиях в браузере</translation>
 <translation id="5833984609253377421">Отправить ссылку</translation>
 <translation id="5854790677617711513">Сохраненные более 30 дней назад</translation>
 <translation id="5858741533101922242">Не удалось включить адаптер Bluetooth</translation>
@@ -630,6 +636,7 @@
 <translation id="618555311922999635">Панель навигации открыта полностью</translation>
 <translation id="6192333916571137726">Скачивание файла</translation>
 <translation id="6192792657125177640">Исключения</translation>
+<translation id="6206551242102657620">Подключение защищено. Информация о сайте.</translation>
 <translation id="6210748933810148297">Не <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: параметры</translation>
 <translation id="6221633008163990886">Чтобы экспортировать пароли, разблокируйте экран</translation>
@@ -721,6 +728,7 @@
 <translation id="6914783257214138813">Ваши пароли будут видны всем, у кого есть доступ к файлу экспорта.</translation>
 <translation id="6942665639005891494">Вы можете в любой момент изменить расположение скачиваемых файлов по умолчанию, воспользовавшись меню "Настройки".</translation>
 <translation id="6945221475159498467">Выбрать</translation>
+<translation id="6963642900430330478">Эта страница представляет опасность. Информация о сайте.</translation>
 <translation id="6963766334940102469">Удалить закладки</translation>
 <translation id="6965382102122355670">ОК</translation>
 <translation id="6978479750597523876">Сбросить настройки перевода</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 6718ca2..af88a65 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -746,6 +746,8 @@
   "java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java",
   "java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java",
   "java/src/org/chromium/chrome/browser/media/router/MediaSource.java",
+  "java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java",
+  "java/src/org/chromium/chrome/browser/media/router/MediaStatusObserver.java",
   "java/src/org/chromium/chrome/browser/media/router/MediaSink.java",
   "java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java",
   "java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java",
@@ -922,6 +924,7 @@
   "java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java",
   "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java",
   "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java",
+  "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java",
   "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchPrefs.java",
   "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java",
   "java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java",
@@ -1871,6 +1874,7 @@
   "javatests/src/org/chromium/chrome/browser/offlinepages/RecentTabsTest.java",
   "javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java",
   "javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java",
+  "javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java",
   "javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java",
   "javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/TestOfflinePageService.java",
   "javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/TestSuggestionsService.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
new file mode 100644
index 0000000..17fbda7
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
@@ -0,0 +1,108 @@
+// 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.
+
+package org.chromium.chrome.browser.offlinepages.prefetch;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.MediumTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.test.ChromeActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.Features;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/** Integration tests for {@link PrefetchConfiguration}. */
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@RunWith(ChromeJUnit4ClassRunner.class)
+public class PrefetchConfigurationTest {
+    @Rule
+    public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
+            new ChromeActivityTestRule<>(ChromeActivity.class);
+
+    @Before
+    public void setUp() throws Exception {
+        // Start Chrome.
+        mActivityTestRule.startMainActivityOnBlankPage();
+    }
+
+    @Test
+    @MediumTest
+    @Feature("OfflinePrefetch")
+    @Features.EnableFeatures(ChromeFeatureList.OFFLINE_PAGES_PREFETCHING)
+    public void testWithPrefetchingFeatureEnabled() {
+        AtomicBoolean isFlagEnabled = new AtomicBoolean();
+        AtomicBoolean isEnabled = new AtomicBoolean();
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            isFlagEnabled.set(PrefetchConfiguration.isPrefetchingFlagEnabled());
+            isEnabled.set(PrefetchConfiguration.isPrefetchingEnabled());
+        });
+        assertTrue(isFlagEnabled.get());
+        assertTrue(isEnabled.get());
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            // Disable prefetching user setting.
+            PrefetchConfiguration.setPrefetchingEnabledInSettings(false);
+            isFlagEnabled.set(PrefetchConfiguration.isPrefetchingFlagEnabled());
+            isEnabled.set(PrefetchConfiguration.isPrefetchingEnabled());
+        });
+        assertTrue(isFlagEnabled.get());
+        assertFalse(isEnabled.get());
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            // Re-enable prefetching user setting.
+            PrefetchConfiguration.setPrefetchingEnabledInSettings(true);
+            isFlagEnabled.set(PrefetchConfiguration.isPrefetchingFlagEnabled());
+            isEnabled.set(PrefetchConfiguration.isPrefetchingEnabled());
+        });
+        assertTrue(isFlagEnabled.get());
+        assertTrue(isEnabled.get());
+    }
+
+    @Test
+    @MediumTest
+    @Feature("OfflinePrefetch")
+    @Features.DisableFeatures(ChromeFeatureList.OFFLINE_PAGES_PREFETCHING)
+    public void testWithPrefetchingFeatureDisabled() {
+        AtomicBoolean isFlagEnabled = new AtomicBoolean();
+        AtomicBoolean isEnabled = new AtomicBoolean();
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            isFlagEnabled.set(PrefetchConfiguration.isPrefetchingFlagEnabled());
+            isEnabled.set(PrefetchConfiguration.isPrefetchingEnabled());
+        });
+        assertFalse(isFlagEnabled.get());
+        assertFalse(isEnabled.get());
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            // Disable prefetching user setting.
+            PrefetchConfiguration.setPrefetchingEnabledInSettings(false);
+            isFlagEnabled.set(PrefetchConfiguration.isPrefetchingFlagEnabled());
+            isEnabled.set(PrefetchConfiguration.isPrefetchingEnabled());
+        });
+        assertFalse(isFlagEnabled.get());
+        assertFalse(isEnabled.get());
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            // Re-enable prefetching user setting.
+            PrefetchConfiguration.setPrefetchingEnabledInSettings(true);
+            isFlagEnabled.set(PrefetchConfiguration.isPrefetchingFlagEnabled());
+            isEnabled.set(PrefetchConfiguration.isPrefetchingEnabled());
+        });
+        assertFalse(isFlagEnabled.get());
+        assertFalse(isEnabled.get());
+    }
+}
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 1ceb8ced..9c233b5 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -434,10 +434,10 @@
     Close
   </message>
   <message name="IDS_FILE_BROWSER_ADD_NEW_SERVICES_BUTTON_LABEL" desc="Title of the button in the left nav to add new services (file systems) to the Files app.">
-    Add new services
+    Add new service
   </message>
   <message name="IDS_FILE_BROWSER_INSTALL_NEW_EXTENSION_LABEL" desc="Title of the menu item for installing new extensions from the web store.">
-    Install new from the webstore
+    Install new service
   </message>
   <message name="IDS_FILE_BROWSER_TASK_VIEW" desc="Title of the action to view (no edit) a file.">
     View
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index 9c0ce15..fb9b137 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -8,6 +8,8 @@
 <translation id="1170115874949214249">‏Chromium را در تلفنتان نصب کنید. پیامکی به شماره تلفن بازیابی حساب شما ارسال خواهیم کرد.</translation>
 <translation id="1174473354587728743">‏این رایانه را به اشتراک می‌گذارید؟ اکنون می‌توانید Chromium را آنطور که می‌خواهید تنظیم کنید.</translation>
 <translation id="1185134272377778587">‏درباره Chromium</translation>
+<translation id="1209657686917656928">{0,plural, =0{‏Chromium هم‌اکنون راه‌اندازی مجدد می‌شود}=1{‏Chromium ‏۱ ثانیه دیگر راه‌اندازی مجدد می‌شود}one{‏Chromium ‏# ثانیه دیگر راه‌اندازی مجدد می‌شود}other{‏Chromium ‏# ثانیه دیگر راه‌اندازی مجدد می‌شود}}</translation>
+<translation id="1267419686153937460">{0,plural, =1{‏Chromium را ظرف یک روز راه‌اندازی مجدد کنید}one{‏Chromium را ظرف # روز راه‌اندازی مجدد کنید}other{‏Chromium را ظرف # روز راه‌اندازی مجدد کنید}}</translation>
 <translation id="1298199220304005244">‏دریافت راهنمایی برای استفاده از سیستم عامل Chromium </translation>
 <translation id="1396446129537741364">‏Chromium می‌خواهد گذرواژه‌ها را نشان دهد.</translation>
 <translation id="1414495520565016063">‏شما وارد سیستم Chromium شدید!</translation>
@@ -23,6 +25,7 @@
 <translation id="1808667845054772817">‏نصب مجدد Chromium</translation>
 <translation id="1869480248812203386">‏می‌توانید با گزارش خودکار جزئیات حوادث امنیتی احتمالی به Google به ایمن‌تر شدن Chromium و استفاده آسان‌تر از آن کمک کنید.</translation>
 <translation id="1881322772814446296">‏شما با حساب مدیریت‌شده وارد سیستم می‌شوید و به سرپرست آن اجازه کنترل بر نمایه Chromium خود را می‌دهید. داده‌های Chromium شما شامل برنامه‌ها، نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیمات برای همیشه به <ph name="USER_NAME" /> مرتبط خواهد شد. می‌توانید این داده‌ها را از طریق داشبورد حساب‌های Google حذف کنید اما نمی‌توانید این داده‌ها را به حساب دیگری مرتبط سازید. در صورت تمایل برای ذخیره داده‌های Chromium موجود به صورت جداگانه می‌توانید نمایه جدیدی ایجاد کنید. <ph name="LEARN_MORE" /></translation>
+<translation id="1895626441344023878">{0,plural, =0{‏به‌روزرسانی Chromium دردسترس است}=1{‏به‌روزرسانی Chromium دردسترس است}one{‏به‌روزرسانی Chromium از # روز پیش دردسترس است}other{‏به‌روزرسانی Chromium از # روز پیش دردسترس است}}</translation>
 <translation id="1929939181775079593">‏Chromium پاسخ نمی‌دهد. مجدداً راه‌اندازی شود؟</translation>
 <translation id="1966382378801805537">‏Chromium نمی‌تواند مرورگر پیش‌فرض را تعیین یا تنظیم کند</translation>
 <translation id="2008474315282236005">‏این کار یک مورد را از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> به سیستم Chromium وارد شوید.</translation>
@@ -52,6 +55,7 @@
 <translation id="2977470724722393594">‏Chromium به‌روز است</translation>
 <translation id="3032787606318309379">‏افزودن به Chromium…</translation>
 <translation id="3046695367536568084">‏برای استفاده از برنامه‌ها باید وارد Chromium شده باشید. این به Chromium اجازه می‌دهد تا برنامه‌ها، نشانک‌ها، سابقه، گذرواژه‌های شما و سایر تنظیمات را در دستگاه‌ها همگام‌سازی کند.</translation>
+<translation id="3052899382720782935">{0,plural, =1{‏Chromium ‏۱ دقیقه دیگر راه‌اندازی مجدد می‌شود}one{‏Chromium ‏# دقیقه دیگر راه‌اندازی مجدد می‌شود}other{‏Chromium ‏# دقیقه دیگر راه‌اندازی مجدد می‌شود}}</translation>
 <translation id="3068515742935458733">‏با ارسال گزارش‌های خرابی و <ph name="UMA_LINK" /> به Google، به بهبود Google کمک کنید</translation>
 <translation id="3103660991484857065">‏نصب‌کننده در خارج کردن بایگانی از حالت فشرده ناموفق بود. لطفاً دوباره Chromium را بارگیری کنید.</translation>
 <translation id="3130323860337406239">‏Chromium درحال استفاده از میکروفون شما است.</translation>
@@ -72,12 +76,14 @@
 <translation id="3582788516608077514">‏در حال به‌روزرسانی Chromium…</translation>
 <translation id="358997566136285270">‏نشان‌واره Chromium</translation>
 <translation id="3713809861844741608">‏باز کردن پیوند در &amp;برگه جدید Chromium</translation>
+<translation id="3728336900324680424">‏Chromium برای ارائه پیشنهاد در نوار نشانی، به Drive شما دسترسی خواهد داشت</translation>
 <translation id="3762167353400286894">‏سیستم عامل Chromium به این زبان نشان داده می‌شود</translation>
 <translation id="378917192836375108">‏Chromium به شما اجازه می‌دهد بر روی شماره تلفن روی وب کلیک کرده و از طریق Skype تماس بگیرید!</translation>
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation>
 <translation id="3852700440713538496">‏Chromium به نوار وظیفه شما پین شود</translation>
 <translation id="3889543394854987837">‏برای باز کردن Chromium و شروع به مرور، روی نامتان کلیک کنید.</translation>
 <translation id="3898493977366060150">‏مرور وب با هوشمندی‌های Google</translation>
+<translation id="3965668104013180445">{0,plural, =1{‏سیستم‌عامل Chromium یک ساعت دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chromium ‏# ساعت دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chromium ‏# ساعت دیگر بازراه‌اندازی می‌شود}}</translation>
 <translation id="4036079820698952681">‏با گزارش <ph name="BEGIN_LINK" />تنظیمات کنونی<ph name="END_LINK" />، به بهتر شدن Chromium کمک کنید</translation>
 <translation id="4050175100176540509">بهبودهای امنیتی مهم و ویژگی‌های جدید در جدیدترین نسخه در دسترس است.</translation>
 <translation id="407254336480250557">‏<ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> را انتخاب کنید</translation>
@@ -104,6 +110,7 @@
 <translation id="4943838377383847465">‏Chromium در حالت پس‌زمینه است.</translation>
 <translation id="4987820182225656817">‏مهمان‌ها می توانند از Chromium استفاده کنند بدون این‌که اثری از خود به جا بگذارند.</translation>
 <translation id="4994636714258228724">‏افرودن خودتان به Chromium</translation>
+<translation id="5021854341188256296">{0,plural, =0{‏به‌روزرسانی سیستم‌عامل Chromium دردسترس است}=1{‏به‌روزرسانی سیستم‌عامل Chromium دردسترس است}one{‏به‌روزرسانی سیستم‌عامل Chromium از # روز پیش دردسترس است}other{‏به‌روزرسانی سیستم‌عامل Chromium از # روز پیش دردسترس است}}</translation>
 <translation id="5032989939245619637">‏ذخیره جزئیات در Chromium</translation>
 <translation id="5045248521775609809">‏Chrome را همه‌ جا ببرید</translation>
 <translation id="5116586539350239523">‏Chromium به‌طور امن جزئیات شخصی‌تان را ذخیره خواهد کرد تا نیازی نباشد آن‌ها را دوباره تایپ کنید.</translation>
@@ -116,10 +123,13 @@
 <translation id="5479196819031988440">‏Chromium OS نمی‌تواند این صفحه را باز کند.</translation>
 <translation id="5480860683791598150">‏Chromium برای هم‌رسانی مکانتان با این سایت باید به مکان شما دسترسی داشته باشد</translation>
 <translation id="549669000822060376">‏وقتی Chromium جدیدترین به‌روزرسانی‌های سیستم را نصب می‌کند، لطفاً صبر کنید.</translation>
+<translation id="5514308096618405748">‏ساخت سیستم‌عامل Chrome به کمک <ph name="BEGIN_LINK_CROS_OSS" />نرم‌افزار منبع آزاد<ph name="END_LINK_CROS_OSS" /> دیگری که Linux (بتا) است، امکان‌پذیر شده است.</translation>
+<translation id="5529843986978123325">{0,plural, =1{‏سیستم‌عامل Chromium ‏۱ دقیقه دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chromium ‏# دقیقه دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chromium ‏# دقیقه دیگر بازراه‌اندازی می‌شود}}</translation>
 <translation id="5631814766731275228">‏نام و تصویر Chromium</translation>
 <translation id="5634636535844844681">‏Chromium به Windows 7 یا بالاتر نیاز دارد.</translation>
 <translation id="5680901439334282664">‏ورود به سیستم Chromium</translation>
 <translation id="5698481217667032250">‏نمایش Chromium به این زبان</translation>
+<translation id="5712253116097046984">‏سرپرست از شما می‌خواهد برای اعمال این به‌روزرسانی، سیستم‌عامل Chromium را بازراه‌اندازی کنید</translation>
 <translation id="5726838626470692954">‏مدیر شما باید شما را از Chromium حذف و دوباره به آن اضافه کند.</translation>
 <translation id="5768914737813585044">‏نمایش سیستم عامل Chromium به این زبان</translation>
 <translation id="5796460469508169315">‏Chromium تقریباً آماده است.</translation>
@@ -136,7 +146,9 @@
 <translation id="6072279588547424923">‏<ph name="EXTENSION_NAME" /> به Chromium اضافه شد</translation>
 <translation id="608189560609172163">‏به دلیل وجود خطا در ورود به سیستم، Chromium قادر به همگام‌سازی داده‌های شما نبود.</translation>
 <translation id="6096348254544841612">‏سفارشی کردن و کنترل Chromium. به‌روزرسانی‌ در دسترس است.</translation>
+<translation id="6120345080069858279">‏Chromium این گذرواژه را در حساب Google شما ذخیره می‌کند. لازم نیست آن را به خاطر بسپارید.</translation>
 <translation id="6129621093834146363">‏<ph name="FILE_NAME" /> خطرناک است، بنابراین Chromium آن را مسدود کرده است.</translation>
+<translation id="620022061217911843">‏سرپرست لازم می‌داند برای اعمال به‌روزرسانی، سیستم‌عامل Chromium را بازراه‌اندازی کنید</translation>
 <translation id="6212496753309875659">‏این رایانه در حال حاضر دارای یک نسخه جدیدتر از Chromium است. درصورتی‌که نرم‌افزار کار نمی‌کند، لطفاً Chromium را حذف نصب کنید و دوباره سعی کنید.</translation>
 <translation id="6248213926982192922">‏Chromium  مرورگر پیش‌فرض شود</translation>
 <translation id="6268381023930128611">‏از Chromium خارج می‌شوید؟</translation>
@@ -189,8 +201,10 @@
 <ph name="BEGIN_LINK_2" />بیشتر بدانید<ph name="END_LINK_2" />
 
 برای دستورالعمل‌های بیشتر، لطفاً رایانامه‌تان (<ph name="ACCOUNT_EMAIL" />) را بررسی کنید.</translation>
+<translation id="7448255348454382571">‏بازراه‌اندازی سیستم‌عامل Chromium</translation>
 <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">‏Chromium برای این سایت به مجوز دسترسی به دوربین نیاز دارد</translation>
+<translation id="7471302858145901434">{0,plural, =1{‏سیستم‌عامل Chromium را ظرف یک روز بازراه‌اندازی کنید}one{‏سیستم‌عامل Chromium را ظرف # روز بازراه‌اندازی کنید}other{‏سیستم‌عامل Chromium را ظرف # روز بازراه‌اندازی کنید}}</translation>
 <translation id="7483335560992089831">‏نمی‌توانید Chromium دارای نسخه مشابه با نسخه در حال اجرا را نصب کنید. لطفاً Chromium را ببندید و دوباره سعی کنید.</translation>
 <translation id="7549178288319965365">‏درباره سیستم عامل Chromium </translation>
 <translation id="7577193603922410712">‏لحظاتی پیش به‌روزرسانی امنیتی ویژه برای Chromium اعمال شد؛ برای فعال شدن آن باید هم‌اکنون راه‌اندازی مجدد کنید (برگه‌هایتان را بازیابی خواهیم کرد).</translation>
@@ -220,10 +234,13 @@
 <translation id="8290862415967981663">‏این فایل ممکن است خطرناک باشد، بنابراین Chromium آن را مسدود کرده است.</translation>
 <translation id="8330519371938183845">‏برای همگام‌سازی و شخصی‌سازی Chromium در همه دستگاه‌هایتان، به سیستم وارد شوید</translation>
 <translation id="8340674089072921962">‏<ph name="USER_EMAIL_ADDRESS" /> قبلاً از Chromium استفاده می‌کرد</translation>
+<translation id="8375950122744241554">‏نمایه‌های کاربر تحت نظارت، از نسخه ۷۰ Chromium دیگر دردسترس نخواهد بود.</translation>
+<translation id="8379713241968949941">{0,plural, =1{‏Chromium یک ساعت دیگر راه‌اندازی مجدد می‌شود}one{‏Chromium # ساعت دیگر راه‌اندازی مجدد می‌شود}other{‏Chromium # ساعت دیگر راه‌اندازی مجدد می‌شود}}</translation>
 <translation id="8453117565092476964">‏بایگانی نصب‌کننده خراب یا نامعتبر است. لطفاً Chromium را دوباره را بارگیری کنید.</translation>
 <translation id="8493179195440786826">‏نسخه Chromium قدیمی است</translation>
 <translation id="85843667276690461">‏دریافت راهنمایی برای استفاده از Chromium </translation>
 <translation id="8586442755830160949">‏حق نسخه‌برداری <ph name="YEAR" /> نویسندگان Chromium. کلیه حقوق محفوظ است.</translation>
+<translation id="8599548569518771270">{0,plural, =0{‏سیستم‌عامل Chromium اکنون بازراه‌اندازی می‌شود}=1{‏سیستم‌عامل Chromium ‏۱ ثانیه دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chromium # ثانیه دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chromium # ثانیه دیگر بازراه‌اندازی می‌شود}}</translation>
 <translation id="8619360774459241877">‏درحال راه‌اندازی Chromium…</translation>
 <translation id="8621669128220841554">‏به دلیل خطای نامشخص، نصب ناموفق بود. لطفاً دوباره Chromium را بارگیری کنید.</translation>
 <translation id="8628626585870903697">‏Chromium فاقد نمایشگر PDF است که برای عملکرد پیش‌نمایش چاپ لازم است.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index 96d8975c..a2413d1 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -8,6 +8,8 @@
 <translation id="1170115874949214249">Installer Chromium på telefonen din. Vi sender en SMS til telefonnummeret ditt for kontogjenoppretting.</translation>
 <translation id="1174473354587728743">Deler du datamaskinen din med andre? Nå kan du konfigurere Chromium akkurat slik du vil.</translation>
 <translation id="1185134272377778587">Om Chromium</translation>
+<translation id="1209657686917656928">{0,plural, =0{Chromium startes på nytt nå}=1{Chromium startes på nytt om 1 sekund}other{Chromium startes på nytt om # sekunder}}</translation>
+<translation id="1267419686153937460">{0,plural, =1{Start Chromium på nytt innen én dag}other{Start Chromium på nytt innen # dager}}</translation>
 <translation id="1298199220304005244">Få hjelp med å bruke Chromium OS</translation>
 <translation id="1396446129537741364">Chromium prøver å vise passord.</translation>
 <translation id="1414495520565016063">Du er logget på Chromium.</translation>
@@ -23,6 +25,7 @@
 <translation id="1808667845054772817">Installer Chromium på nytt</translation>
 <translation id="1869480248812203386">Du kan bidra til å gjøre Chromium tryggere og enklere å bruke ved å rapportere detaljer om mulige sikkerhetsbrudd til Google automatisk.</translation>
 <translation id="1881322772814446296">Du logger deg på med en administrert konto og gir tilhørende administratorer kontroll over Chromium-profilen din. Chromium-dataene dine, slik som apper, bokmerker, loggen, passord og andre innstillinger knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse dataene via oversikten for Google-kontoer, men du kan ikke knytte disse dataene til en annen konto. Du kan velge om du vil opprette en ny profil for å holde de eksisterende Chromium-dataene atskilte. <ph name="LEARN_MORE" /></translation>
+<translation id="1895626441344023878">{0,plural, =0{En Chromium-oppdatering er tilgjengelig}=1{En Chromium-oppdatering er tilgjengelig}other{En Chromium-oppdatering har vært tilgjengelig i # dager}}</translation>
 <translation id="1929939181775079593">Chromium svarer ikke. Vil du starte den på nytt nå?</translation>
 <translation id="1966382378801805537">Chromium kan ikke fastslå eller angi standardnettleseren</translation>
 <translation id="2008474315282236005">Dette sletter 1 element fra denne enheten. For å hente dataene dine igjen senere må du logge på Chromium som <ph name="USER_EMAIL" />.</translation>
@@ -52,6 +55,7 @@
 <translation id="2977470724722393594">Chromium er oppdatert</translation>
 <translation id="3032787606318309379">Legger til i Chromium …</translation>
 <translation id="3046695367536568084">Du må være logget på Chromium for å bruke apper. På denne måten kan Chromium synkronisere appene, bokmerkene og passordene dine, samt loggen din og andre innstillinger, på alle enheter.</translation>
+<translation id="3052899382720782935">{0,plural, =1{Chromium startes på nytt om 1 minutt}other{Chromium startes på nytt om # minutter}}</translation>
 <translation id="3068515742935458733">Bidra til å gjøre Chromium bedre ved å sende programstopprapporter og <ph name="UMA_LINK" /> til Google</translation>
 <translation id="3103660991484857065">Installasjonsprogrammet kunne ikke dekomprimere arkivet. Last ned Chromium på nytt.</translation>
 <translation id="3130323860337406239">Chromium bruker mikrofonen din.</translation>
@@ -73,12 +77,14 @@
 <translation id="3582788516608077514">Oppdaterer Chromium …</translation>
 <translation id="358997566136285270">Chromium-logo</translation>
 <translation id="3713809861844741608">Åpne linken i en ny fane i Chromium</translation>
+<translation id="3728336900324680424">Chromium vil få tilgang til disken din for å kunne gi deg forslag i adressefeltet</translation>
 <translation id="3762167353400286894">Chromium OS vises på dette språket</translation>
 <translation id="378917192836375108">Med Chromium kan du klikke på et telefonnummer på nettet og ringe til det med Skype.</translation>
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> – Chromium</translation>
 <translation id="3852700440713538496">Fest Chromium til oppgavelinjen</translation>
 <translation id="3889543394854987837">Klikk på navnet ditt for å åpne Chromium og starte surfingen.</translation>
 <translation id="3898493977366060150">Surfing med Googles smarte funksjoner</translation>
+<translation id="3965668104013180445">{0,plural, =1{Chromium OS vil starte på nytt om én time}other{Chromium OS vil starte på nytt om # timer}}</translation>
 <translation id="4036079820698952681">Bidra til å gjøre Chromium bedre ved å rapportere de <ph name="BEGIN_LINK" />nåværende innstillingene<ph name="END_LINK" /></translation>
 <translation id="4050175100176540509">Viktige sikkerhetsforbedringer og nye funksjoner er tilgjengelige i den nyeste versjonen.</translation>
 <translation id="407254336480250557">Velg <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
@@ -105,6 +111,7 @@
 <translation id="4943838377383847465">Chromium er i bakgrunnsmodus.</translation>
 <translation id="4987820182225656817">Gjester kan bruke Chromium uten å etterlate seg spor.</translation>
 <translation id="4994636714258228724">Legg til deg selv i Chromium</translation>
+<translation id="5021854341188256296">{0,plural, =0{En Chromium-OS-oppdatering er tilgjengelig}=1{En Chromium-OS-oppdatering er tilgjengelig}other{En Chromium-OS-oppdatering har vært tilgjengelig i # dager}}</translation>
 <translation id="5032989939245619637">Lagre detaljer i Chromium</translation>
 <translation id="5045248521775609809">Bruk Chromium overalt</translation>
 <translation id="5116586539350239523">Chromium lagrer personopplysningene dine sikkert, slik at du slipper å skrive dem inn på nytt.</translation>
@@ -117,10 +124,13 @@
 <translation id="5479196819031988440">Chromium OS kan ikke åpne denne siden.</translation>
 <translation id="5480860683791598150">Chromium trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet</translation>
 <translation id="549669000822060376">Vent mens Chromium installerer de nyeste systemoppdateringene.</translation>
+<translation id="5514308096618405748">Chrome OS muliggjøres av <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />, som Linux(Beta).</translation>
+<translation id="5529843986978123325">{0,plural, =1{Chromium OS vil starte på nytt om 1 minutt}other{Chromium OS vil starte på nytt om # minutter}}</translation>
 <translation id="5631814766731275228">Navn og bilde i Chromium</translation>
 <translation id="5634636535844844681">Chromium krever Windows 7 eller nyere.</translation>
 <translation id="5680901439334282664">logg på Chromium</translation>
 <translation id="5698481217667032250">Vis Chromium på dette språket</translation>
+<translation id="5712253116097046984">Administratoren din ber deg om å starte Chromium OS på nytt for å kunne bruke denne oppdateringen</translation>
 <translation id="5726838626470692954">Administratoren din må fjerne og legge deg til i Chromium på nytt.</translation>
 <translation id="5768914737813585044">Vis Chromium OS på dette språket</translation>
 <translation id="5796460469508169315">Chromium er nesten klar.</translation>
@@ -137,7 +147,9 @@
 <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> er lagt til i Chromium</translation>
 <translation id="608189560609172163">Chromium kunne ikke synkronisere dataene dine på grunn av en feil under påloggingen.</translation>
 <translation id="6096348254544841612">Tilpass og kontrollér Chromium. Oppdatering er tilgjengelig.</translation>
+<translation id="6120345080069858279">Chromium lagrer dette passordet i Google-kontoen din, så du trenger ikke å huske det.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> er farlig, så Chromium har blokkert den.</translation>
+<translation id="620022061217911843">Administratoren din krever at du starter Chromium på nytt for at en oppdatering skal tas i bruk</translation>
 <translation id="6212496753309875659">Denne datamaskinen har allerede en nyere versjon av Chromium. Hvis programvaren ikke fungerer, må du avinstallere Chromium og prøve på nytt.</translation>
 <translation id="6248213926982192922">Gjør Chromium til standard nettleser</translation>
 <translation id="6268381023930128611">Vil du logge av Chromium?</translation>
@@ -191,8 +203,10 @@
 <ph name="BEGIN_LINK_2" />Finn ut mer<ph name="END_LINK_2" />
 
 Vi har sendt deg (<ph name="ACCOUNT_EMAIL" />) en e-post med nærmere instruksjoner.</translation>
+<translation id="7448255348454382571">Start Chromium OS på nytt</translation>
 <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium for utviklere</translation>
 <translation id="7451052299415159299">Chromium trenger tilgang til kameraet ditt for dette nettstedet</translation>
+<translation id="7471302858145901434">{0,plural, =1{Start Chromium på nytt innen én dag}other{Start Chromium OS på nytt innen # dager}}</translation>
 <translation id="7483335560992089831">Kan ikke installere den samme Chromium-versjonen som kjører. Lukk Chromium og prøv på nytt.</translation>
 <translation id="7549178288319965365">Om Chromium OS</translation>
 <translation id="7577193603922410712">En spesiell sikkerhetsoppdatering for Chromium ble nettopp installert. Du bør starte på nytt nå for at den skal tre i kraft (vi gjenoppretter fanene dine).</translation>
@@ -222,10 +236,13 @@
 <translation id="8290862415967981663">Denne filen kan være farlig, så Chromium har blokkert den.</translation>
 <translation id="8330519371938183845">Logg på for å synkronisere og gi Chromium et personlig preg på alle enhetene dine</translation>
 <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> brukte Chromium tidligere</translation>
+<translation id="8375950122744241554">Overvåkede brukerprofiler vil ikke lengre være tilgjengelig fra og med Chromium 70.</translation>
+<translation id="8379713241968949941">{0,plural, =1{Chromium startes på nytt om én time}other{Chromium startes på nytt om # timer}}</translation>
 <translation id="8453117565092476964">Installasjonsarkivet er skadet eller ugyldig. Last ned Chromium på nytt.</translation>
 <translation id="8493179195440786826">Chromium er utdatert</translation>
 <translation id="85843667276690461">Få hjelp med å bruke Chromium</translation>
 <translation id="8586442755830160949">Copyright <ph name="YEAR" /> – The Chromium Authors. Med enerett.</translation>
+<translation id="8599548569518771270">{0,plural, =0{Chromium OS vil starte på nytt nå}=1{Chromium OS startes på nytt om 1 sekund}other{Chromium OS startes på nytt om # sekunder}}</translation>
 <translation id="8619360774459241877">Starter Chromium ...</translation>
 <translation id="8621669128220841554">Installeringen mislyktes på grunn av en uspesifisert feil. Last ned Chromium på nytt.</translation>
 <translation id="8628626585870903697">Chromium omfatter ikke PDF-visningsprogrammet som er nødvendig for at «Forhåndsvisning av utskrift» skal fungere.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index 7cda3444..edf9ee8e 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -8,6 +8,8 @@
 <translation id="1170115874949214249">Установите Chromium на телефон. Мы отправим SMS на номер, указанный в вашем аккаунте.</translation>
 <translation id="1174473354587728743">Пользуетесь компьютером вместе с коллегой или другом? Теперь каждый из вас сможет настроить Chromium по своему вкусу.</translation>
 <translation id="1185134272377778587">О Chromium</translation>
+<translation id="1209657686917656928">{0,plural, =0{Chromium перезапускается}=1{Chromium перезапустится через 1 секунду}one{Chromium перезапустится через # секунду}few{Chromium перезапустится через # секунды}many{Chromium перезапустится через # секунд}other{Chromium перезапустится через # секунды}}</translation>
+<translation id="1267419686153937460">{0,plural, =1{Перезапустите Chromium в течение дня}one{Перезапустите Chromium в течение # дня}few{Перезапустите Chromium в течение # дней}many{Перезапустите Chromium в течение # дней}other{Перезапустите Chromium в течение # дня}}</translation>
 <translation id="1298199220304005244">Помощь по использованию Chromium OS</translation>
 <translation id="1396446129537741364">Вводимые пароли будут отображаться в Chromium.</translation>
 <translation id="1414495520565016063">Добро пожаловать в Chromium!</translation>
@@ -23,6 +25,7 @@
 <translation id="1808667845054772817">Переустановить Chromium</translation>
 <translation id="1869480248812203386">Вы можете сделать защиту Chromium ещё надежнее. Просто разрешите автоматически отправлять в Google информацию о возможных проблемах безопасности</translation>
 <translation id="1881322772814446296">Выполнив вход в управляемый аккаунт, вы предоставляете администратору право контролировать настройки вашего профиля Chromium. Ваши данные Chromium (приложения, закладки, история, пароли и другие настройки) будут временно связаны с аккаунтом <ph name="USER_NAME" />. Эти данные можно удалить в Личном кабинете Google, но их нельзя связать с другим аккаунтом. Чтобы сохранить данные Chromium отдельно, создайте новый профиль. <ph name="LEARN_MORE" /></translation>
+<translation id="1895626441344023878">{0,plural, =0{Доступно обновление Chromium}=1{Доступно обновление Chromium}one{Обновление Chromium доступно # день}few{Обновление Chromium доступно # дня}many{Обновление Chromium доступно # дней}other{Обновление Chromium доступно # дня}}</translation>
 <translation id="1929939181775079593">Chromium не отвечает. Перезапустить сейчас?</translation>
 <translation id="1966382378801805537">Chromium не удалось определить или задать браузер по умолчанию</translation>
 <translation id="2008474315282236005">С устройства будет удален 1 объект. Чтобы восстановить данные позже, войдите в Chromium как <ph name="USER_EMAIL" />.</translation>
@@ -52,6 +55,7 @@
 <translation id="2977470724722393594">Вы используете последнюю версию Chromium</translation>
 <translation id="3032787606318309379">Добавление в Chromium...</translation>
 <translation id="3046695367536568084">Для работы с приложениями необходимо выполнить вход в Chromium. Это обеспечит синхронизацию приложений, закладок, истории, паролей и настроек, сохраненных на всех ваших устройствах.</translation>
+<translation id="3052899382720782935">{0,plural, =1{Chromium перезапустится через 1 минуту}one{Chromium перезапустится через # минуту}few{Chromium перезапустится через # минуты}many{Chromium перезапустится через # минут}other{Chromium перезапустится через # минуты}}</translation>
 <translation id="3068515742935458733">Помочь улучшить Chromium, отправляя в Google отчеты о сбоях и <ph name="UMA_LINK" /></translation>
 <translation id="3103660991484857065">Установка прервана на этапе распаковки архива. Скачайте Chromium ещё раз.</translation>
 <translation id="3130323860337406239">Chromium использует микрофон.</translation>
@@ -71,12 +75,14 @@
 <translation id="3582788516608077514">Выполняется обновление Chromium...</translation>
 <translation id="358997566136285270">Логотип Chromium</translation>
 <translation id="3713809861844741608">Открыть ссылку в новой вкладке браузера Chromium</translation>
+<translation id="3728336900324680424">Chromium получит доступ к вашему Google Диску, чтобы вы могли просматривать рекомендации в адресной строке.</translation>
 <translation id="3762167353400286894">Этот язык сейчас используется в Chromium OS</translation>
 <translation id="378917192836375108">В Chromium вы можете нажать на любой номер телефона и позвонить на него через Skype.</translation>
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> – Chromium</translation>
 <translation id="3852700440713538496">Как прикрепить Chromium на панель задач</translation>
 <translation id="3889543394854987837">Нажмите на свое имя, чтобы войти в Chromium.</translation>
 <translation id="3898493977366060150">Технологии Google для простого и быстрого поиска в Интернете.</translation>
+<translation id="3965668104013180445">{0,plural, =1{Chromium OS перезапустится через 1 час}one{Chromium OS перезапустится через # час}few{Chromium OS перезапустится через # часа}many{Chromium OS перезапустится через # часов}other{Chromium OS перезапустится через # часа}}</translation>
 <translation id="4036079820698952681">Отправьте отчет о <ph name="BEGIN_LINK" />текущих настройках Chromium<ph name="END_LINK" />, чтобы помочь нам улучшить браузер</translation>
 <translation id="4050175100176540509">В последней версии улучшена защита и добавлены новые функции.</translation>
 <translation id="407254336480250557">Выберите <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
@@ -103,6 +109,7 @@
 <translation id="4943838377383847465">Chromium работает в фоновом режиме</translation>
 <translation id="4987820182225656817">Используйте Chromium в гостевом режиме, если не хотите сохранять данные о посещенных сайтах.</translation>
 <translation id="4994636714258228724">Добавить пользователя Chromium</translation>
+<translation id="5021854341188256296">{0,plural, =0{Доступно обновление Chromium OS}=1{Доступно обновление Chromium OS}one{Обновление Chromium OS доступно # день}few{Обновление Chromium OS доступно # дня}many{Обновление Chromium OS доступно # дней}other{Обновление Chromium OS доступно # дня}}</translation>
 <translation id="5032989939245619637">Сохранять данные в Chromium</translation>
 <translation id="5045248521775609809">Chromium всегда под рукой</translation>
 <translation id="5116586539350239523">Chromium будет хранить ваши данные в защищенном виде, поэтому их не придется вводить повторно.</translation>
@@ -115,10 +122,13 @@
 <translation id="5479196819031988440">Chromium OS не может открыть эту страницу</translation>
 <translation id="5480860683791598150">Для этого сайта Chromium запрашивает доступ к данным о вашем местоположении.</translation>
 <translation id="549669000822060376">Подождите, пока Chromium устанавливает последние обновления системы</translation>
+<translation id="5514308096618405748">Chrome OS, как и Linux (бета-версия), работает благодаря дополнительному <ph name="BEGIN_LINK_CROS_OSS" />программному обеспечению с открытым исходным кодом<ph name="END_LINK_CROS_OSS" />.</translation>
+<translation id="5529843986978123325">{0,plural, =1{Chromium OS перезапустится через 1 минуту}one{Chromium OS перезапустится через # минуту}few{Chromium OS перезапустится через # минуты}many{Chromium OS перезапустится через # минут}other{Chromium OS перезапустится через # минуты}}</translation>
 <translation id="5631814766731275228">Имя и изображение профиля Chromium</translation>
 <translation id="5634636535844844681">Для работы Chromium необходима ОС Windows 7 или более поздней версии.</translation>
 <translation id="5680901439334282664">войдите в Chromium</translation>
 <translation id="5698481217667032250">Отображать Chromium на этом языке</translation>
+<translation id="5712253116097046984">Администратор просит перезапустить Chromium OS для установки обновления.</translation>
 <translation id="5726838626470692954">Администратор устройства должен удалить ваш аккаунт из Chromium и добавить его снова</translation>
 <translation id="5768914737813585044">Отображать Chromium OS на этом языке</translation>
 <translation id="5796460469508169315">Chromium почти готов к работе</translation>
@@ -135,7 +145,9 @@
 <translation id="6072279588547424923">Расширение "<ph name="EXTENSION_NAME" />" добавлено в Chromium</translation>
 <translation id="608189560609172163">Chromium не удалось синхронизировать данные из-за ошибки входа в систему.</translation>
 <translation id="6096348254544841612">Новая версия Chromium уже вышла!</translation>
+<translation id="6120345080069858279">Этот пароль будет сохранен в аккаунте Google. Вам не нужно его запоминать.</translation>
 <translation id="6129621093834146363">Chromium заблокировал файл <ph name="FILE_NAME" /> как опасный.</translation>
+<translation id="620022061217911843">Администратор требует перезапустить Chromium OS для установки обновления.</translation>
 <translation id="6212496753309875659">На этом компьютере установлена актуальная версия Chromium. Если программа не работает, удалите Chromium и повторите попытку.</translation>
 <translation id="6248213926982192922">Назначить Chromium браузером по умолчанию</translation>
 <translation id="6268381023930128611">Выйти из Chromium?</translation>
@@ -187,8 +199,10 @@
 <ph name="BEGIN_LINK_2" />Подробнее…<ph name="END_LINK_2" />
 
 Дальнейшие инструкции отправлены на адрес <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7448255348454382571">Перезапуск Chromium OS</translation>
 <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium для разработчиков</translation>
 <translation id="7451052299415159299">Для этого сайта Chromium запрашивает доступ к камере.</translation>
+<translation id="7471302858145901434">{0,plural, =1{Перезапустите Chromium OS в течение 1 дня}one{Перезапустите Chromium OS в течение # дня}few{Перезапустите Chromium OS в течение # дней}many{Перезапустите Chromium OS в течение # дней}other{Перезапустите Chromium OS в течение # дня}}</translation>
 <translation id="7483335560992089831">Невозможно установить ту же версию Chromium, которая уже присутствует в системе. Закройте Chromium и повторите попытку.</translation>
 <translation id="7549178288319965365">О Chromium OS</translation>
 <translation id="7577193603922410712">Установлено специальное обновление системы безопасности. Перезапустите Chromium (все вкладки будут восстановлены).</translation>
@@ -218,10 +232,13 @@
 <translation id="8290862415967981663">Chromium заблокировал этот файл как потенциально опасный.</translation>
 <translation id="8330519371938183845">Войдите, чтобы синхронизировать данные Chromium на всех устройствах</translation>
 <translation id="8340674089072921962">Адрес <ph name="USER_EMAIL_ADDRESS" /> уже использовался в Chromium</translation>
+<translation id="8375950122744241554">Начиная с версии Chromium 70 контролируемые профили станут недоступны.</translation>
+<translation id="8379713241968949941">{0,plural, =1{Chromium перезапустится через 1 час}one{Chromium перезапустится через # час}few{Chromium перезапустится через # часа}many{Chromium перезапустится через # часов}other{Chromium перезапустится через # часа}}</translation>
 <translation id="8453117565092476964">Установочный архив поврежден. Скачайте Chromium ещё раз.</translation>
 <translation id="8493179195440786826">Версия Chromium устарела</translation>
 <translation id="85843667276690461">Помощь по использованию Chromium</translation>
 <translation id="8586442755830160949">© The Chromium Authors, <ph name="YEAR" /> . Все права защищены.</translation>
+<translation id="8599548569518771270">{0,plural, =0{Chromium OS перезапускается}=1{Chromium OS перезапустится через 1 секунду}one{Chromium OS перезапустится через # секунду}few{Chromium OS перезапустится через # секунды}many{Chromium OS перезапустится через # секунд}other{Chromium OS перезапустится через # секунды}}</translation>
 <translation id="8619360774459241877">Запуск Chromium...</translation>
 <translation id="8621669128220841554">В процессе установки произошла неизвестная ошибка. Скачайте Chromium ещё раз.</translation>
 <translation id="8628626585870903697">В Chromium нет функции просмотра PDF-файлов, которая нужна для предварительного просмотра при печати.</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index 9fbc7b1e..37d8c50a 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -207,7 +207,7 @@
 <translation id="7962572577636132072">Chromium స్వయంచాలకంగా నవీకరించబడుతుంది కనుక మీరు ఎల్లప్పుడూ తాజా సంస్కరణను కలిగి ఉంటారు.</translation>
 <translation id="7975919845073681630">ఇది Chromium యొక్క రెండవ ఇన్‌స్టాలేషన్, దీన్ని మీ డిఫాల్ట్ బ్రౌజర్‌గా చేయడం సాధ్యపడదు.</translation>
 <translation id="7979877361127045932">Chromium మెనులో దాచండి</translation>
-<translation id="8013436988911883588">ఓసారి Chromeకి యాక్సెస్ లభించాక, ఆపై వెబ్‌సైట్‌లకు ఏమైనా యాక్సెస్‌ కావాలంటే మిమ్మల్ని అడగవచ్చు.</translation>
+<translation id="8013436988911883588">ఓసారి Chromiumకి యాక్సెస్ లభించాక, ఆపై వెబ్‌సైట్‌లకు ఏమైనా యాక్సెస్‌ కావాలంటే అవి మిమ్మల్ని అడగవచ్చు.</translation>
 <translation id="8030318113982266900">మీ పరికరాన్ని <ph name="CHANNEL_NAME" /> ఛానెల్‌కి నవీకరిస్తోంది...</translation>
 <translation id="8157153840442649507">Chromium ఈ భాషలో ప్రదర్శించబడుతోంది</translation>
 <translation id="81770708095080097">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chromium దీన్ని బ్లాక్ చేసింది.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index ae71501..fcacd90 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">በመተግበሪያው ውስጥ በሚከፍቷቸው ፋይሎች እና አቃፊዎች ላይ ይጽፋል</translation>
 <translation id="3688526734140524629">ሰርጥ ቀይር</translation>
 <translation id="3688578402379768763">የተዘመነ</translation>
-<translation id="3691214267321877444">Google Payን የሚጠቀሙ የመክፈያ ዘዴዎች እና አድራሻዎች።</translation>
 <translation id="3691231116639905343">የቁልፍ ሰሌዳ መተግበሪያዎች</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> የእርስዎን ማያ ገጽ ማጋራት ይፈልጋል</translation>
 <translation id="3693415264595406141">የይለፍ ቃል፦</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">የመተግበሪያዎች አቋራጮችን አሳይ</translation>
 <translation id="3785727820640310185">የተቀመጡ የዚህ ጣቢያ የይለፍ ቃላት</translation>
-<translation id="3785852283863272759">የኢሜይል ገጽ ቦታ</translation>
 <translation id="3786301125658655746">ከመስመር ውጪ ነዎት</translation>
 <translation id="3788401245189148511">ይህንን ሊያደርግ ይችላል፦</translation>
 <translation id="3789841737615482174">ጫን  </translation>
@@ -4036,6 +4034,7 @@
 <translation id="7175353351958621980">የተጫነው ከ፦</translation>
 <translation id="7180611975245234373">አድስ</translation>
 <translation id="7180865173735832675">አብጅ</translation>
+<translation id="7182359331070524176">አንድ የGoogle ፎቶዎች አልበም ይምረጡ</translation>
 <translation id="7186088072322679094">በመሣሪያ አሞሌ ውስጥ አቆይ</translation>
 <translation id="7187428571767585875">የሚወገዱ ወይም የሚቀየሩ የመዝገብ ግቤቶችን፦</translation>
 <translation id="7189234443051076392">በእርስዎ መሣሪያ ላይ በቂ ባዶ ቦታ መኖሩን ያረጋግጡ</translation>
@@ -4616,6 +4615,7 @@
 <translation id="8028993641010258682">መጠን</translation>
 <translation id="8030656706657716245">አታሚ አክል</translation>
 <translation id="8032244173881942855">ትሩን cast ማድረግ አልተቻለም።</translation>
+<translation id="8033827949643255796">ተመርጧል</translation>
 <translation id="8033958968890501070">ጊዜው አልቋል</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{ሁሉንም በ&amp;ማንነት የማያሳውቅ መስኮት ውስጥ ክፈት}=1{&amp;ማንነትን በማያሳውቅ መስኮት ውስጥ ክፈት}one{ሁሉንም (#) በ&amp;ማንነት የማያሳውቅ መስኮት ውስጥ ክፈት}other{ሁሉንም (#) በ&amp;ማንነት የማያሳውቅ መስኮት ውስጥ ክፈት}}</translation>
 <translation id="8037117027592400564">ተሰብስቦ በተሰራ ንግግር አማካኝነት ሁሉንም የተነገሩ ጽሑፎች ያነብባል</translation>
@@ -4908,7 +4908,6 @@
 <translation id="8523493869875972733">ለውጦችን አስቀምጥ</translation>
 <translation id="8523849605371521713">በመመሪያ የታከለ</translation>
 <translation id="8525306231823319788">ሙሉ ማያ ገጽ</translation>
-<translation id="8525982673980740788">የእርስዎን ስልክ ግንኙነት ለየእርስዎ Chromebook የሚጠቀሙ አዳዲስ ባህሪያትን ያክሉ</translation>
 <translation id="8528074251912154910">ቋንቋዎችን አክል</translation>
 <translation id="8528962588711550376">በመግባት ላይ.</translation>
 <translation id="8529026713753283969">በዚህ ስልክ ላይ ማሳወቂያ ስለሚያገኙ ስልኩን በአቅራቢያ ያቆዩት።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index ef93ce5..25927c4 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1780,7 +1780,6 @@
 <translation id="3688507211863392146">تحرير الملفات التي تفتحها في التطبيق</translation>
 <translation id="3688526734140524629">تغيير القناة</translation>
 <translation id="3688578402379768763">مُحَدّث</translation>
-<translation id="3691214267321877444">‏طرق الدفع والعناوين باستخدام Google Pay.</translation>
 <translation id="3691231116639905343">تطبيقات لوحة المفاتيح</translation>
 <translation id="3691267899302886494">يريد <ph name="HOST" /> مشاركة شاشتك.</translation>
 <translation id="3693415264595406141">كلمة المرور:</translation>
@@ -1852,7 +1851,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">إظهار اختصار التطبيقات</translation>
 <translation id="3785727820640310185">كلمات المرور المحفوظة لهذا الموقع</translation>
-<translation id="3785852283863272759">موقع صفحة البريد الإلكتروني</translation>
 <translation id="3786301125658655746">أنت غير متصل</translation>
 <translation id="3788401245189148511">يمكنه:</translation>
 <translation id="3789841737615482174">تثبيت</translation>
@@ -4610,6 +4608,7 @@
 <translation id="8028993641010258682">الحجم</translation>
 <translation id="8030656706657716245">إضافة طابعة</translation>
 <translation id="8032244173881942855">يتعذّر إرسال علامة التبويب.</translation>
+<translation id="8033827949643255796">تم التحديد</translation>
 <translation id="8033958968890501070">انتهاء المهلة</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{فتح الكل في &amp;نافذة التصفح المتخفي}=1{فتح في &amp;نافذة التصفح المتخفي}two{فتح كلا العنوانين (#) في &amp;نافذة التصفح المتخفي}few{فتح كل الـ (#) عناوين في &amp;نافذة التصفح المتخفي}many{فتح كل الـ (#) عنوانًا في &amp;نافذة التصفح المتخفي}other{فتح كل الـ (#) عنوان في &amp;نافذة التصفح المتخفي}}</translation>
 <translation id="8037117027592400564">قراءة جميع النصوص المنطوقة باستخدام الكلام المركب</translation>
@@ -4902,7 +4901,6 @@
 <translation id="8523493869875972733">الإبقاء على التغييرات</translation>
 <translation id="8523849605371521713">تمت الإضافة من قبل السياسة</translation>
 <translation id="8525306231823319788">ملء الشاشة</translation>
-<translation id="8525982673980740788">‏يمكنك إضافة ميزات جديدة تستخدم اتصال هاتفك بجهاز Chromebook</translation>
 <translation id="8528074251912154910">إضافة اللغات</translation>
 <translation id="8528962588711550376">جارٍ تسجيل الدخول.</translation>
 <translation id="8529026713753283969">ستتلقى إشعارًا على هذا الهاتف، لذلك احتفظ بهاتفك بالقرب منك.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 277b394..be3df46 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1780,7 +1780,6 @@
 <translation id="3688507211863392146">Запис във файлове и папки, които сте отворили в приложението</translation>
 <translation id="3688526734140524629">Промяна на канала</translation>
 <translation id="3688578402379768763">Актуално</translation>
-<translation id="3691214267321877444">Начини на плащане и адреси при използване на Google Pay.</translation>
 <translation id="3691231116639905343">Приложения за клавиатури</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> иска да сподели екрана ви</translation>
 <translation id="3693415264595406141">Парола:</translation>
@@ -1852,7 +1851,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Показване на прекия път към приложенията</translation>
 <translation id="3785727820640310185">Запазени пароли за този сайт</translation>
-<translation id="3785852283863272759">Изпращане по имейл на местоположението на страницата</translation>
 <translation id="3786301125658655746">Офлайн сте</translation>
 <translation id="3788401245189148511">То би имало възможност за:</translation>
 <translation id="3789841737615482174">Инсталиране</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">Размер</translation>
 <translation id="8030656706657716245">Добавяне на принтер</translation>
 <translation id="8032244173881942855">Предаването на раздела не е възможно.</translation>
+<translation id="8033827949643255796">откроени</translation>
 <translation id="8033958968890501070">Времето за изчакване изтече</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Отваряне на всички в прозорец в режим „&amp;инкогнито“}=1{Отваряне в прозорец в режим „&amp;инкогнито“}other{Отваряне на всички (#) в прозорец в режим „&amp;инкогнито“}}</translation>
 <translation id="8037117027592400564">Четене на целия текст, произнесен посредством синтезирания говор</translation>
@@ -4906,7 +4905,6 @@
 <translation id="8523493869875972733">Запазване на промените</translation>
 <translation id="8523849605371521713">Добавено от правило</translation>
 <translation id="8525306231823319788">На цял екран</translation>
-<translation id="8525982673980740788">Добавяне на нови функции, които използват връзката на телефона ви с вашия Chromebook</translation>
 <translation id="8528074251912154910">Добавяне на езици</translation>
 <translation id="8528962588711550376">Влиза се.</translation>
 <translation id="8529026713753283969">Ще получите известие на този телефон, така че го дръжте подръка.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 442d32e..99bff5e 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1766,7 +1766,6 @@
 <translation id="3688507211863392146">আপনি অ্যাপ্লিকেশানটিতে খোলেন এমন ফাইল এবং ফোল্ডারগুলি লিখুন</translation>
 <translation id="3688526734140524629">চ্যানেল পরিবর্তন করুন</translation>
 <translation id="3688578402379768763">আপ-টু-ডেট</translation>
-<translation id="3691214267321877444">Google Pay ব্যবহার করে এমন পেমেন্টের পদ্ধতি এবং ঠিকানাগুলি।</translation>
 <translation id="3691231116639905343">কীবোর্ড অ্যাপ</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> আপনার স্ক্রিন শেয়ার করতে চায়</translation>
 <translation id="3693415264595406141">পাসওয়ার্ড:</translation>
@@ -1837,7 +1836,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">অ্যাপ্লিকেশানগুলির শর্টকাট দেখান</translation>
 <translation id="3785727820640310185">এই সাইটের জন্য সেভ করা পাসওয়ার্ড</translation>
-<translation id="3785852283863272759">ইমেল পৃষ্ঠার লোকেশন</translation>
 <translation id="3786301125658655746">আপনি অফলাইন আছেন</translation>
 <translation id="3788401245189148511">এটা হতে পারে:</translation>
 <translation id="3789841737615482174">ইনস্টল করুন</translation>
@@ -4571,6 +4569,7 @@
 <translation id="8028993641010258682">সাইজ</translation>
 <translation id="8030656706657716245">প্রিন্টার জুড়ুন</translation>
 <translation id="8032244173881942855">ট্যাব কাস্ট করতে অক্ষম৷</translation>
+<translation id="8033827949643255796">নির্বাচিত</translation>
 <translation id="8033958968890501070">সময় শেষ হয়ে গেছে</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{সবগুলি &amp;ছদ্মবেশী উইন্ডোতে খুলুন}=1{&amp;ছদ্মবেশী উইন্ডোতে খুলুন}one{সবগুলিকে (#টি) &amp;ছদ্মবেশী উইন্ডোতে খুলুন}other{সবগুলিকে (#টি) &amp;ছদ্মবেশী উইন্ডোতে খুলুন}}</translation>
 <translation id="8037117027592400564">সিন্থেসাইজড স্পিচ ব্যবহার করে কথিত সব পাঠ্য পড়ুন</translation>
@@ -4861,7 +4860,6 @@
 <translation id="8523493869875972733">পরিবর্তনগুলি সেভ করুন</translation>
 <translation id="8523849605371521713">নীতির মাধ্যমে যোগ করা হয়েছে</translation>
 <translation id="8525306231823319788">পূর্ণ স্ক্রীণ</translation>
-<translation id="8525982673980740788">Chromebook-এ আপনার ফোনের কানেকশন ব্যবহার করে এমন নতুন ফিচারগুলি যোগ করুন</translation>
 <translation id="8528074251912154910">ভাষা যোগ করুন</translation>
 <translation id="8528962588711550376">প্রবেশ করুন হচ্ছে৷</translation>
 <translation id="8529026713753283969">এই ফোনে একটি বিজ্ঞপ্তি আসবে তাই ফোনটি কাছাকাছি রাখুন।</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index bc5dc12..29951cd 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1780,7 +1780,6 @@
 <translation id="3688507211863392146">Escriure en fitxers i carpetes que s'obrin a l'aplicació</translation>
 <translation id="3688526734140524629">Canvia el canal</translation>
 <translation id="3688578402379768763">Actualitzat</translation>
-<translation id="3691214267321877444">Formes de pagament i adreces que fan servir Google Pay.</translation>
 <translation id="3691231116639905343">Aplicacions de teclat</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> vol compartir la teva pantalla</translation>
 <translation id="3693415264595406141">Contrasenya:</translation>
@@ -1852,7 +1851,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Mostra la drecera d'aplicacions</translation>
 <translation id="3785727820640310185">Contrasenyes desades per a aquest lloc web</translation>
-<translation id="3785852283863272759">Envia la ubicació de la pàgina per correu electrònic</translation>
 <translation id="3786301125658655746">No tens connexió</translation>
 <translation id="3788401245189148511">Podria:</translation>
 <translation id="3789841737615482174">Instal·la</translation>
@@ -4611,6 +4609,7 @@
 <translation id="8028993641010258682">Mida</translation>
 <translation id="8030656706657716245">Afegeix una impressora</translation>
 <translation id="8032244173881942855">No es pot emetre la pestanya.</translation>
+<translation id="8033827949643255796">seleccionats</translation>
 <translation id="8033958968890501070">Temps d'espera esgotat</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Obre-les totes en una &amp;finestra d'incògnit}=1{Obre en una &amp;finestra d'incògnit}other{Obre-les totes (#) en una &amp;finestra d'incògnit}}</translation>
 <translation id="8037117027592400564">Llegeix tot el text en veu alta mitjançant una síntesi de veu</translation>
@@ -4903,7 +4902,6 @@
 <translation id="8523493869875972733">Mantén els canvis</translation>
 <translation id="8523849605371521713">Afegida per la política</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
-<translation id="8525982673980740788">Afegeix funcions noves que utilitzin la connexió del telèfon a Chromebook</translation>
 <translation id="8528074251912154910">Afegeix idiomes</translation>
 <translation id="8528962588711550376">S'està iniciant la sessió.</translation>
 <translation id="8529026713753283969">Rebràs una notificació en aquest telèfon, així que no te n'allunyis.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 06e8d797d..f768340 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1780,7 +1780,6 @@
 <translation id="3688507211863392146">Zapisovat do souborů a složek, které v aplikaci otevřete</translation>
 <translation id="3688526734140524629">Změnit kanál</translation>
 <translation id="3688578402379768763">Aktuální</translation>
-<translation id="3691214267321877444">Platební metody a adresy pomocí služby Google Pay.</translation>
 <translation id="3691231116639905343">Klávesnice</translation>
 <translation id="3691267899302886494">Web <ph name="HOST" /> chce sdílet vaši obrazovku</translation>
 <translation id="3693415264595406141">Heslo:</translation>
@@ -1852,7 +1851,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Zobrazit zástupce aplikací</translation>
 <translation id="3785727820640310185">Uložená hesla pro tento web</translation>
-<translation id="3785852283863272759">Umístění stránky e-mailu</translation>
 <translation id="3786301125658655746">Jste offline</translation>
 <translation id="3788401245189148511">Mohlo by:</translation>
 <translation id="3789841737615482174">Instalovat</translation>
@@ -4608,6 +4606,7 @@
 <translation id="8028993641010258682">Velikost</translation>
 <translation id="8030656706657716245">Přidat tiskárnu</translation>
 <translation id="8032244173881942855">Kartu nelze odeslat.</translation>
+<translation id="8033827949643255796">vybráno</translation>
 <translation id="8033958968890501070">Vypršel časový limit</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Otevřít vše v &amp;anonymním okně}=1{Otevřít v &amp;anonymním okně}few{Otevřít vše (#) v &amp;anonymním okně}many{Otevřít vše (#) v &amp;anonymním okně}other{Otevřít vše (#) v &amp;anonymním okně}}</translation>
 <translation id="8037117027592400564">Číst veškerý text vyslovovaný pomocí syntetické řeči</translation>
@@ -4900,7 +4899,6 @@
 <translation id="8523493869875972733">Uchovat změny</translation>
 <translation id="8523849605371521713">Přidáno zásadou</translation>
 <translation id="8525306231823319788">Celá obrazovka</translation>
-<translation id="8525982673980740788">Přidávat nové funkce, které používají připojení telefonu k Chromebooku</translation>
 <translation id="8528074251912154910">Přidat jazyky</translation>
 <translation id="8528962588711550376">Přihlašování.</translation>
 <translation id="8529026713753283969">Na tomto telefonu se zobrazí oznámení, mějte jej proto u sebe.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 41980047..4a081118 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1780,7 +1780,6 @@
 <translation id="3688507211863392146">Skrive til filer og mapper, som du åbner i applikationen</translation>
 <translation id="3688526734140524629">Skift kanal</translation>
 <translation id="3688578402379768763">Opdateret</translation>
-<translation id="3691214267321877444">Betalingsmetoder og adresser, der bruger Google Pay.</translation>
 <translation id="3691231116639905343">Tastaturapps</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> anmoder om at dele din skærm</translation>
 <translation id="3693415264595406141">Adgangskode:</translation>
@@ -1852,7 +1851,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Vis genveje for Apps</translation>
 <translation id="3785727820640310185">Gemte adgangskoder til dette website</translation>
-<translation id="3785852283863272759">Mail-sideplacering</translation>
 <translation id="3786301125658655746">Du er offline</translation>
 <translation id="3788401245189148511">Den kunne:</translation>
 <translation id="3789841737615482174">Installer</translation>
@@ -4612,6 +4610,7 @@
 <translation id="8028993641010258682">Størrelse</translation>
 <translation id="8030656706657716245">Tilføj printeren</translation>
 <translation id="8032244173881942855">Fanen kunne ikke castes.</translation>
+<translation id="8033827949643255796">valgt</translation>
 <translation id="8033958968890501070">Timeout</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Åbn alle i &amp;inkognitovindue}=1{Åbn i &amp;inkognitovindue}one{Åbn (#) i &amp;inkognitovindue}other{Åbn alle (#) i &amp;inkognitovindue}}</translation>
 <translation id="8037117027592400564">Læs hele teksten højt ved hjælp af talesyntese</translation>
@@ -4904,7 +4903,6 @@
 <translation id="8523493869875972733">Behold ændringerne</translation>
 <translation id="8523849605371521713">Tilføjet af politik</translation>
 <translation id="8525306231823319788">Fuld skærm</translation>
-<translation id="8525982673980740788">Tilføj nye funktioner, der anvender din telefons forbindelse til din Chromebook</translation>
 <translation id="8528074251912154910">Tilføj sprog</translation>
 <translation id="8528962588711550376">Logger ind...</translation>
 <translation id="8529026713753283969">Du får en underretning på denne telefon, så sørg for, at den er i nærheden.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 35b77a1d..7245c8d 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1778,7 +1778,6 @@
 <translation id="3688507211863392146">In Dateien und Ordner schreiben, die Sie in der Anwendung öffnen</translation>
 <translation id="3688526734140524629">Kanal ändern</translation>
 <translation id="3688578402379768763">Auf dem neusten Stand</translation>
-<translation id="3691214267321877444">Zahlungsmethoden und Adressen bei Google Pay.</translation>
 <translation id="3691231116639905343">Tastatur-Apps</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> möchte Ihren Bildschirm freigeben</translation>
 <translation id="3693415264595406141">Passwort:</translation>
@@ -1850,7 +1849,6 @@
 <translation id="3783640748446814672">Alt</translation>
 <translation id="3785308913036335955">Verknüpfung "Apps" anzeigen</translation>
 <translation id="3785727820640310185">Für diese Website gespeicherte Passwörter</translation>
-<translation id="3785852283863272759">Seitenadresse als E-Mail senden</translation>
 <translation id="3786301125658655746">Sie sind offline</translation>
 <translation id="3788401245189148511">Sie könnte:</translation>
 <translation id="3789841737615482174">Installieren</translation>
@@ -4610,6 +4608,7 @@
 <translation id="8028993641010258682">Größe</translation>
 <translation id="8030656706657716245">Drucker hinzufügen</translation>
 <translation id="8032244173881942855">Tab kann nicht gestreamt werden.</translation>
+<translation id="8033827949643255796">Ausgewählt</translation>
 <translation id="8033958968890501070">Zeitüberschreitung</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Alle in &amp;Inkognitofenster öffnen}=1{In &amp;Inkognitofenster öffnen}other{Alle (#) in &amp;Inkognitofenster öffnen}}</translation>
 <translation id="8037117027592400564">Alle mit künstlicher Sprachausgabe gesprochenen Texte lesen</translation>
@@ -4903,7 +4902,6 @@
 <translation id="8523493869875972733">Änderungen beibehalten</translation>
 <translation id="8523849605371521713">Von Richtlinie hinzugefügt</translation>
 <translation id="8525306231823319788">Vollbildmodus</translation>
-<translation id="8525982673980740788">Neue Funktionen hinzufügen, bei denen die Verbindung des Smartphones mit dem Chromebook genutzt wird</translation>
 <translation id="8528074251912154910">Sprachen hinzufügen</translation>
 <translation id="8528962588711550376">Anmeldung läuft...</translation>
 <translation id="8529026713753283969">Wir senden Ihnen eine Benachrichtigung auf dieses Smartphone. Sie sollten es daher griffbereit haben.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 827a7893..70489c752 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Εγγραφή σε αρχεία και φακέλους που ανοίγετε στην εφαρμογή</translation>
 <translation id="3688526734140524629">Αλλαγή καναλιού</translation>
 <translation id="3688578402379768763">Ενημερωμένη</translation>
-<translation id="3691214267321877444">Τρόποι πληρωμής και διευθύνσεις που χρησιμοποιούν το Google Pay.</translation>
 <translation id="3691231116639905343">Εφαρμογές πληκτρολογίου</translation>
 <translation id="3691267899302886494">Ο ιστότοπος <ph name="HOST" /> επιθυμεί να μοιραστεί την οθόνη σας</translation>
 <translation id="3693415264595406141">Κωδικός πρόσβασης:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Εμφάνιση συντόμευσης εφαρμογών</translation>
 <translation id="3785727820640310185">Αποθηκευμένοι κωδικοί πρόσβασης για αυτόν τον ιστότοπο</translation>
-<translation id="3785852283863272759">Τοποθεσία Σελίδας Ήλεκτρονικού Ταχυδρομείου</translation>
 <translation id="3786301125658655746">Είστε εκτός σύνδεσης</translation>
 <translation id="3788401245189148511">Θα μπορούσε να εκτελέσει τις εξής ενέργειες:</translation>
 <translation id="3789841737615482174">Εγκατάσταση</translation>
@@ -4615,6 +4613,7 @@
 <translation id="8028993641010258682">Μέγεθος</translation>
 <translation id="8030656706657716245">Προσθήκη εκτυπωτή</translation>
 <translation id="8032244173881942855">Δεν είναι δυνατή η μετάδοση της καρτέλας.</translation>
+<translation id="8033827949643255796">επιλεγμένο</translation>
 <translation id="8033958968890501070">Λήξη ορίου χρόνου</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Άνοιγμα όλων σε παράθυρο για &amp;ανώνυμη περιήγηση}=1{Άνοιγμα σε παράθυρο για &amp;ανώνυμη περιήγηση}other{Άνοιγμα όλων (#) σε παράθυρο για &amp;ανώνυμη περιήγηση}}</translation>
 <translation id="8037117027592400564">Ανάγνωση όλου του κειμένου που εκφωνείται με χρήση ομιλίας σύνθεσης</translation>
@@ -4907,7 +4906,6 @@
 <translation id="8523493869875972733">Διατήρηση αλλαγών</translation>
 <translation id="8523849605371521713">Προστέθηκε από την πολιτική</translation>
 <translation id="8525306231823319788">Πλήρης οθόνη</translation>
-<translation id="8525982673980740788">Προσθέστε νέες λειτουργίες που χρησιμοποιούν τη σύνδεση του τηλεφώνου σας με το Chromebook</translation>
 <translation id="8528074251912154910">Προσθήκη γλωσσών</translation>
 <translation id="8528962588711550376">Γίνεται σύνδεση.</translation>
 <translation id="8529026713753283969">Θα λάβετε μια ειδοποίηση σε αυτό το τηλέφωνο, επομένως κρατήστε το κοντά σας.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 3bc9f05..40b1a63 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -327,7 +327,7 @@
 <translation id="1478233201128522094">Next time, a new phone will unlock this <ph name="DEVICE_TYPE" />. Turn off Smart Lock in Settings.</translation>
 <translation id="1478340334823509079">Details: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Installation is not enabled</translation>
-<translation id="1483493594462132177">send</translation>
+<translation id="1483493594462132177">Send</translation>
 <translation id="1485015260175968628">It can now:</translation>
 <translation id="1485141095922496924">Version <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">Search passwords</translation>
@@ -1781,7 +1781,6 @@
 <translation id="3688507211863392146">Write to files and folders that you open in the application</translation>
 <translation id="3688526734140524629">Change channel</translation>
 <translation id="3688578402379768763">Up-to-date</translation>
-<translation id="3691214267321877444">Payment methods and addresses using Google Pay.</translation>
 <translation id="3691231116639905343">Keyboard apps</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> wants to share your screen</translation>
 <translation id="3693415264595406141">Password:</translation>
@@ -1853,7 +1852,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Show Apps Shortcut</translation>
 <translation id="3785727820640310185">Saved passwords for this site</translation>
-<translation id="3785852283863272759">Email Page Location</translation>
 <translation id="3786301125658655746">You are offline</translation>
 <translation id="3788401245189148511">It could:</translation>
 <translation id="3789841737615482174">Install</translation>
@@ -4038,6 +4036,7 @@
 <translation id="7175353351958621980">Loaded from:</translation>
 <translation id="7180611975245234373">Refresh</translation>
 <translation id="7180865173735832675">Customise</translation>
+<translation id="7182359331070524176">Select a Google Photos album</translation>
 <translation id="7186088072322679094">Keep in Toolbar</translation>
 <translation id="7187428571767585875">Registry entries to be removed or changed:</translation>
 <translation id="7189234443051076392">Make sure that there is enough space on your device</translation>
@@ -4613,6 +4612,7 @@
 <translation id="8028993641010258682">Size</translation>
 <translation id="8030656706657716245">Add Printer</translation>
 <translation id="8032244173881942855">Unable to cast tab.</translation>
+<translation id="8033827949643255796">selected</translation>
 <translation id="8033958968890501070">Time out</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Open all in &amp;incognito window}=1{Open in &amp;incognito window}other{Open all (#) in &amp;incognito window}}</translation>
 <translation id="8037117027592400564">Read all text spoken using synthesised speech</translation>
@@ -4905,7 +4905,6 @@
 <translation id="8523493869875972733">Keep Changes</translation>
 <translation id="8523849605371521713">Added by policy</translation>
 <translation id="8525306231823319788">Full screen</translation>
-<translation id="8525982673980740788">Add new features that use your phone's connection to your Chromebook</translation>
 <translation id="8528074251912154910">Add languages</translation>
 <translation id="8528962588711550376">Signing in.</translation>
 <translation id="8529026713753283969">You’ll get a notification on this phone so keep the phone nearby.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index faceec02..82e9a8a4 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1779,7 +1779,6 @@
 <translation id="3688507211863392146">Escribir en archivos y carpetas que abras en la aplicación</translation>
 <translation id="3688526734140524629">Cambiar canal</translation>
 <translation id="3688578402379768763">Actualizado</translation>
-<translation id="3691214267321877444">Formas de pago y direcciones con Google Pay.</translation>
 <translation id="3691231116639905343">Apps de teclados</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> desea compartir tu pantalla</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
@@ -1851,7 +1850,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Mostrar acceso directo a las aplicaciones</translation>
 <translation id="3785727820640310185">Se guardaron contraseñas para este sitio</translation>
-<translation id="3785852283863272759">Ubicación de la página de correo electrónico</translation>
 <translation id="3786301125658655746">No estás conectado.</translation>
 <translation id="3788401245189148511">Podría:</translation>
 <translation id="3789841737615482174">Instalar</translation>
@@ -4611,6 +4609,7 @@
 <translation id="8028993641010258682">Tamaño</translation>
 <translation id="8030656706657716245">Agregar impresora</translation>
 <translation id="8032244173881942855">No se puede transmitir la pestaña</translation>
+<translation id="8033827949643255796">seleccionados</translation>
 <translation id="8033958968890501070">Se agotó el tiempo de espera</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Abrir todo en una ventana de &amp;incógnito}=1{Abrir en una ventana de &amp;incógnito}other{Abrir todo (#) en una ventana de &amp;incógnito}}</translation>
 <translation id="8037117027592400564">Leer todo el texto hablado con la síntesis de voz</translation>
@@ -4904,7 +4903,6 @@
 <translation id="8523493869875972733">Conservar cambios</translation>
 <translation id="8523849605371521713">Agregada por la política</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
-<translation id="8525982673980740788">Agrega funciones nuevas que usan la conexión del teléfono a la Chromebook</translation>
 <translation id="8528074251912154910">Agregar idiomas</translation>
 <translation id="8528962588711550376">Accediendo.</translation>
 <translation id="8529026713753283969">Recibirás una notificación en este teléfono, por lo que te recomendamos tenerlo cerca.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index e37c1db..503c5756 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1780,7 +1780,6 @@
 <translation id="3688507211863392146">Escribe en archivos y carpetas que abras en la aplicación</translation>
 <translation id="3688526734140524629">Cambiar canal</translation>
 <translation id="3688578402379768763">Actualizado</translation>
-<translation id="3691214267321877444">Métodos de pago y direcciones con Google Pay.</translation>
 <translation id="3691231116639905343">Aplicaciones de teclados</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> quiere compartir tu pantalla</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
@@ -1852,7 +1851,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Mostrar acceso directo de aplicaciones</translation>
 <translation id="3785727820640310185">Contraseñas guardadas de este sitio web</translation>
-<translation id="3785852283863272759">Ubicación de la página de correo electrónico</translation>
 <translation id="3786301125658655746">No tienes conexión.</translation>
 <translation id="3788401245189148511">Podría:</translation>
 <translation id="3789841737615482174">Instalar</translation>
@@ -4034,6 +4032,7 @@
 <translation id="7175353351958621980">Cargado desde:</translation>
 <translation id="7180611975245234373">Actualizar</translation>
 <translation id="7180865173735832675">Personalizar</translation>
+<translation id="7182359331070524176">Seleccionar un álbum de Google Fotos</translation>
 <translation id="7186088072322679094">Mantener en la barra de herramientas</translation>
 <translation id="7187428571767585875">Entradas de registro que se van a eliminar o cambiar:</translation>
 <translation id="7189234443051076392">Deja suficiente espacio en tu dispositivo</translation>
@@ -4609,6 +4608,7 @@
 <translation id="8028993641010258682">Tamaño</translation>
 <translation id="8030656706657716245">Añadir impresora</translation>
 <translation id="8032244173881942855">No se puede enviar la pestaña.</translation>
+<translation id="8033827949643255796">seleccionados</translation>
 <translation id="8033958968890501070">Tiempo de espera agotado</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Abrir todas en una &amp;ventana de incógnito}=1{Abrir en una &amp;ventana de incógnito}other{Abrir (#) en una &amp;ventana de incógnito}}</translation>
 <translation id="8037117027592400564">Leer todo el texto hablado con la síntesis de voz</translation>
@@ -4901,7 +4901,6 @@
 <translation id="8523493869875972733">Mantener cambios</translation>
 <translation id="8523849605371521713">Añadida por política</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
-<translation id="8525982673980740788">Añade funciones que usen la conexión de tu teléfono con tu Chromebook</translation>
 <translation id="8528074251912154910">Añadir idiomas</translation>
 <translation id="8528962588711550376">Accediendo</translation>
 <translation id="8529026713753283969">Recibirás una notificación en este teléfono, por lo que debes tenerlo cerca.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 91e0315..e622e19 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Failidesse ja kaustadesse kirjutamine, mille rakenduses avate</translation>
 <translation id="3688526734140524629">Vaheta kanalit</translation>
 <translation id="3688578402379768763">Ajakohane</translation>
-<translation id="3691214267321877444">Makseviisid ja aadressid, mis kasutavad teenust Google Pay.</translation>
 <translation id="3691231116639905343">Klaviatuurirakendused</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> soovib teie ekraani jagada</translation>
 <translation id="3693415264595406141">Parool:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Kuva teenuse Apps otsetee</translation>
 <translation id="3785727820640310185">Selle saidi jaoks salvestatud paroolid</translation>
-<translation id="3785852283863272759">Meililehe asukoht</translation>
 <translation id="3786301125658655746">Olete võrguühenduseta</translation>
 <translation id="3788401245189148511">See võiks:</translation>
 <translation id="3789841737615482174">Installi</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">Suurus</translation>
 <translation id="8030656706657716245">Lisa printer</translation>
 <translation id="8032244173881942855">Vahelehte ei õnnestu üle kanda.</translation>
+<translation id="8033827949643255796">valitud</translation>
 <translation id="8033958968890501070">Ajalõpp</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Ava kõik &amp;inkognito aknas}=1{Ava &amp;inkognito aknas}other{Ava kõik (#) &amp;inkognito aknas}}</translation>
 <translation id="8037117027592400564">Kogu kõnesünteesil põhineva teksti lugemine</translation>
@@ -4907,7 +4906,6 @@
 <translation id="8523493869875972733">Säilita muudatused</translation>
 <translation id="8523849605371521713">Reegliga lisatud</translation>
 <translation id="8525306231823319788">Täisekraan</translation>
-<translation id="8525982673980740788">Lisage oma Chromebookile uued funktsioonid, mis kasutavad teie telefoni ühendust</translation>
 <translation id="8528074251912154910">Keelte lisamine</translation>
 <translation id="8528962588711550376">Sisselogimine.</translation>
 <translation id="8529026713753283969">Märguande saate selles telefonis, seega hoidke telefon käepärast.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 77c9786..f6c2d221 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -222,6 +222,7 @@
 <translation id="1316136264406804862">در حال جستجو...</translation>
 <translation id="1316495628809031177">همگام‌سازی موقتاً متوقف شده است</translation>
 <translation id="1319979322914001937">‏برنامه‌ای که فهرست فیلترشده‌ای از افزونه‌ها از فروشگاه وب Chrome را نشان می‌دهد. می‌توان افزونه‌ها در این فهرست را به‌طور مستقیم از برنامه نصب کرد.</translation>
+<translation id="1322046419516468189">در <ph name="SAVED_PASSWORDS_STORE" /> گذرواژه‌های ذخیره‌شده‌تان را مشاهده و مدیریت کنید</translation>
 <translation id="1326317727527857210">‏برای دسترسی به برگه‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید.</translation>
 <translation id="1327074568633507428">‏چاپگر در Google Cloud Print</translation>
 <translation id="1327977588028644528">دروازه</translation>
@@ -415,11 +416,13 @@
 <translation id="1618268899808219593">مرکز را&amp;هنمایی</translation>
 <translation id="162035744160882748">‏روشن کردن همگام‌سازی، شخصی‌سازی و سرویس‌های دیگر Google</translation>
 <translation id="1620510694547887537">دوربین</translation>
+<translation id="1623132449929929218">درحال‌حاضر تصاویر دردسترس نیستند. برای دیدن مجموعه‌های کاغذدیواری دوباره به اینترنت متصل شوید.</translation>
 <translation id="1624026626836496796">این اطلاعات تنها یک‌بار از شما درخواست می‌شود و اطلاعات کاربری شما ذخیره نمی‌شوند.</translation>
 <translation id="1627276047960621195">توصیف‌گرهای فایل</translation>
 <translation id="1627408615528139100">قبلاً بارگیری شده است</translation>
 <translation id="1632803087685957583">به شما امکان می‌دهد سرعت تکرار صفحه‌کلید، پیش‌بینی کلمه و سایر موارد را تنظیم کنید</translation>
 <translation id="1635033183663317347">قیم شما نصب کرده است.</translation>
+<translation id="1635885551358739414">‏ممکن است Google از محتوای سایت‌هایی که بازدید می‌کنید و فعالیت و تعاملات مرورگر برای شخصی کردن Chrome و سایر سرویس‌های Google (مانند «مترجم»، «جستجو» و آگهی‌ها) استفاده کند. می‌توانید این مورد را در «تنظیمات» سفارشی کنید.</translation>
 <translation id="1637224376458524414">‏این نشانک را در iPhone خود دریافت کنید</translation>
 <translation id="1637765355341780467">هنگام باز کردن نمایه‌تان خطایی رخ داد. ممکن است برخی از قابلیت‌ها در دسترس نباشند.</translation>
 <translation id="1639239467298939599">بارگیری</translation>
@@ -450,6 +453,7 @@
 <translation id="166179487779922818">گذرواژه بیش از حد کوتاه است.</translation>
 <translation id="1661867754829461514">پین جا افتاده</translation>
 <translation id="16620462294541761">متأسفانه، گذرواژه شما تأیید نشد. لطفاً دوباره امتحان کنید.</translation>
+<translation id="1662550410081243962">ذخیره و تکمیل روش‌های پرداخت</translation>
 <translation id="166278006618318542">الگوریتم کلید عمومی موضوع</translation>
 <translation id="166439687370499867">تغییر پیکربندی‌های شبکه هم‌رسانی‌شده مجاز نیست</translation>
 <translation id="1665611772925418501">امکان تغییر این فایل وجود نداشت.</translation>
@@ -459,6 +463,7 @@
 <translation id="1673137583248014546"><ph name="URL" /> می‌خواهد به ساخت و مدل «کلید امنیتی» شما دسترسی پیدا کند</translation>
 <translation id="167832068858235403">کاهش صدا</translation>
 <translation id="1679068421605151609">ابزار برنامه‌نویس</translation>
+<translation id="1680849702532889074">‏هنگام نصب برنامه Linux خطایی روی داد.</translation>
 <translation id="16815041330799488">به سایت‌ها اجازه داده نشود به نوشتار و تصاویر کپی‌شده در بریده‌دان دسترسی پیدا کنند</translation>
 <translation id="1682548588986054654">پنجره جدید ناشناس</translation>
 <translation id="168715261339224929">برای دریافت نشانک‌ها در همه دستگاه‌هایتان، همگام‌سازی را روشن کنید.</translation>
@@ -494,6 +499,7 @@
 <translation id="1732215134274276513">برداشتن پین برگه‌ها</translation>
 <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> ممکن است نتواند خود را به‌روز نگه دارد</translation>
 <translation id="1736419249208073774">کاوش</translation>
+<translation id="1736827427463982819">‏خاموش کردن Linux (بتا)</translation>
 <translation id="1737968601308870607">اشکال پرونده</translation>
 <translation id="1741314857973421784">ادامه</translation>
 <translation id="174173592514158117">‏نمایش همه پوشه‌های Play</translation>
@@ -666,6 +672,7 @@
 <translation id="1997484222658892567"><ph name="URL" /> می‌خواهد داده‌های بزرگ را برای همیشه در رایانه محلی‌تان ذخیره کند</translation>
 <translation id="1997616988432401742">گواهی‌نامه‌های شما</translation>
 <translation id="1999115740519098545">هنگام شروع به کار</translation>
+<translation id="2000419248597011803">برخی کوکی‌ها و جستجوها را از نوار نشانی و جعبه جستجو به موتور جستجوی پیش‌فرض ارسال می‌کند</translation>
 <translation id="2001796770603320721">مدیریت در درایو</translation>
 <translation id="2004663115385769400">باز کردن با $1 ممکن نیست</translation>
 <translation id="200544492091181894">همیشه می‌توانید این مورد را بعداً در تنظیمات تغییر دهید</translation>
@@ -692,6 +699,7 @@
 <translation id="2045969484888636535">ادامه مسدود کردن کوکی‌ها</translation>
 <translation id="204622017488417136">‏دستگاه شما به نسخه قبلاً نصب شده Chrome باز می‌گردد. همه حساب‌های کاربری و داده‌های محلی حذف می‌شوند. این کار قابل بازگشت نیست.</translation>
 <translation id="2048182445208425546">دسترسی به ترافیک شبکه شما</translation>
+<translation id="2048653237708779538">کنش دردسترس نیست</translation>
 <translation id="204914487372604757">ایجاد میان‌بر</translation>
 <translation id="2050339315714019657">عمودی</translation>
 <translation id="2053312383184521053">داده‌های حالت بی‌حرکت</translation>
@@ -780,6 +788,7 @@
 <translation id="2178098616815594724">افزایه <ph name="PEPPER_PLUGIN_NAME" /> در <ph name="PEPPER_PLUGIN_DOMAIN" /> می‌خواهد به رایانه شما دسترسی پیدا کند</translation>
 <translation id="2178614541317717477">‏بی اعتبارشدن CA</translation>
 <translation id="218070003709087997">استفاده از شماره برای نشان دادن تعداد کپی‌های چاپ (۱ تا ۹۹۹).</translation>
+<translation id="2183558561014688873">‏هرزمان که هنگام بیدار بودن و باز بودن قفل دستگاه می‌گویید «OK Google»، به «دستیار» دسترسی خواهید داشت.</translation>
 <translation id="2187895286714876935">خطای وارد کردن مجوز سرور</translation>
 <translation id="2187906491731510095">افزونه‌ها به‌روزرسانی شدند</translation>
 <translation id="2188881192257509750">باز کردن <ph name="APPLICATION" /></translation>
@@ -851,6 +860,7 @@
 <translation id="2282146716419988068">‏پردازش GPU</translation>
 <translation id="2282155092769082568">نشانی وب پیکربندی خودکار</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2283340219607151381">ذخیره و تکمیل نشانی</translation>
 <translation id="2286841657746966508">آدرس ارسال صورتحساب</translation>
 <translation id="2288181517385084064">رفتن به ضبط‌کننده ویدیو</translation>
 <translation id="2288735659267887385">تنظیمات دسترس‌پذیری</translation>
@@ -932,6 +942,7 @@
 <translation id="2425665904502185219">حجم کل فایل</translation>
 <translation id="2428510569851653187">توضیح دهید وقتی برگه خراب شد مشغول انجام چه کاری بودید</translation>
 <translation id="2431027948063157455">‏«دستیار Google» بارگیری نشد. لطفاً اتصال شبکه را بررسی کرده و دوباره امتحان کنید.</translation>
+<translation id="2432753757290432042">‏Linux (بتا) باید به‌روزرسانی شود</translation>
 <translation id="2433452467737464329">‏برای بازخوانی خودکار صفحه، یک پارامتر جستجو به نشانی وب اضافه کنید: chrome://network/?refresh=&lt;sec&gt;‎</translation>
 <translation id="2433507940547922241">شکل ظاهری</translation>
 <translation id="2433836460518180625">فقط باز کردن قفل دستگاه</translation>
@@ -1180,6 +1191,7 @@
 <translation id="2775104091073479743">ویرایش اثر انگشت</translation>
 <translation id="2776441542064982094">به‌نظر می‌رسد هیچ دستگاهی برای ثبت در شبکه در دسترس نیست. اگر دستگاهتان روشن و به اینترنت متصل است، با استفاده از دستورالعمل‌های موجود در دفترچه راهنمای آن، دوباره سعی کنید آن را ثبت کنید.</translation>
 <translation id="2781692009645368755">Google Pay</translation>
+<translation id="2782104745158847185">‏خطا هنگام نصب برنامه Linux</translation>
 <translation id="2783298271312924866">بارگیری شد</translation>
 <translation id="2783321960289401138">ایجاد میان‌بر...</translation>
 <translation id="2783829359200813069">انتخاب نوع رمزگذاری</translation>
@@ -1204,6 +1216,7 @@
 <translation id="2812944337881233323">تلاش کنید از سیستم خارج و دوباره وارد شوید</translation>
 <translation id="2812989263793994277">تصویری نشان داده نشود</translation>
 <translation id="2814489978934728345">توقف بارگیری این صفحه</translation>
+<translation id="281504910091592009">‏در <ph name="BEGIN_LINK" />حساب Google<ph name="END_LINK" /> خود گذرواژه‌های ذخیره‌شده را مشاهده و مدیریت کنید</translation>
 <translation id="2815500128677761940">نوار نشانک‌ها</translation>
 <translation id="2815693974042551705">پوشه نشانک</translation>
 <translation id="2818476747334107629">جزئیات چاپگر</translation>
@@ -1284,6 +1297,7 @@
 <translation id="2939938020978911855">نمایش دستگاه‌های بلوتوث دردسترس</translation>
 <translation id="2941112035454246133">کم</translation>
 <translation id="2942560570858569904">درحال انتظار…</translation>
+<translation id="2942581856830209953">سفارشی کردن این صفحه</translation>
 <translation id="2943400156390503548">اسلایدها</translation>
 <translation id="2943503720238418293">از نام کوتاه‌تری استفاده کنید</translation>
 <translation id="2946119680249604491">افزودن اتصال</translation>
@@ -1764,12 +1778,12 @@
 <translation id="3688507211863392146">نوشتن بر روی فایل‌ها و پوشه‌هایی که در برنامه باز می‌کنید</translation>
 <translation id="3688526734140524629">تغییر کانال</translation>
 <translation id="3688578402379768763">به‌روز</translation>
-<translation id="3691214267321877444">‏روش‌های پرداخت و نشانی‌های مورداستفاده در Google Pay.</translation>
 <translation id="3691231116639905343">برنامه‌های صفحه‌کلید</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> می‌خواهد صفحه شما را هم‌رسانی کند</translation>
 <translation id="3693415264595406141">گذرواژه:</translation>
 <translation id="3694027410380121301">انتخاب برگه قبلی</translation>
 <translation id="3699624789011381381">آدرس ايميل</translation>
+<translation id="3699920817649120894">همگام‌سازی و شخصی‌سازی خاموش شود؟</translation>
 <translation id="3700888195348409686">درحال ارائه (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3702500414347826004">صفحه‌های شروع تغییر کردند تا <ph name="URL" /> به آن‌ها اضافه شود.</translation>
 <translation id="370415077757856453">جاوا اسکریپت مسدود شد</translation>
@@ -1835,7 +1849,6 @@
 <translation id="3783640748446814672">دگرساز</translation>
 <translation id="3785308913036335955">نمایش میان‌بر «برنامه‌ها»</translation>
 <translation id="3785727820640310185">گذرواژه‌های ذخیره‌شده برای این سایت</translation>
-<translation id="3785852283863272759">ایمیل کردن مکان صفحه</translation>
 <translation id="3786301125658655746">شما آفلاین هستید</translation>
 <translation id="3788401245189148511">این می‌توانست:</translation>
 <translation id="3789841737615482174">نصب</translation>
@@ -1867,6 +1880,7 @@
 <translation id="3827774300009121996">&amp;تمام صفحه</translation>
 <translation id="3828029223314399057">جستجوی نشانک‌ها</translation>
 <translation id="3830674330436234648">بازپخش در دسترس نیست</translation>
+<translation id="3831436149286513437">‏پیشنهادهای جستجوی Google Drive</translation>
 <translation id="3831486154586836914">وارد حالت مرور کلی پنجره شدید</translation>
 <translation id="383161972796689579">مالک این دستگاه امکان افزوده شدن کاربران جدید را غیرفعال کرده است</translation>
 <translation id="3834775135533257713">برنامه «<ph name="TO_INSTALL_APP_NAME" />» اضافه نشد، چون با «<ph name="INSTALLED_APP_NAME" />» ناسازگار است.</translation>
@@ -1900,6 +1914,7 @@
 <translation id="3871092408932389764">پایین‌ترین</translation>
 <translation id="3872220884670338524">عملکردهای بیشتر، حساب ذخیره‌شده برای <ph name="USERNAME" /> در <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">فضای دیسک را خالی کنید، در غیر این صورت دستگاه پاسخ نخواهد داد.</translation>
+<translation id="3873315167136380065">برای روشن کردن این گزینه، <ph name="BEGIN_LINK" />همگام‌سازی را بازنشانی کنید<ph name="END_LINK" /> تا عبارت عبور همگام‌سازی حذف شود</translation>
 <translation id="3878840326289104869">ایجاد کاربر نظارت شده</translation>
 <translation id="3879748587602334249">مدیریت بارگیری</translation>
 <translation id="3880709822663530586">«کلید امنیتی» فقط وقتی کار می‌کند که بلوتوث دستگاه روشن باشد</translation>
@@ -2023,6 +2038,7 @@
 <translation id="4068776064906523561">اثرانگشت‌های ذخیره‌شده</translation>
 <translation id="407173827865827707">با کلیک</translation>
 <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: خطای ورود به سیستم</translation>
+<translation id="4071828814509176232">Ok Google</translation>
 <translation id="4074900173531346617">گواهی امضاکننده ایمیل</translation>
 <translation id="407520071244661467">مقیاس</translation>
 <translation id="4075639477629295004">ارسال محتوای <ph name="FILE_NAME" /> امکان‌پذیر نیست.</translation>
@@ -2090,6 +2106,7 @@
 <translation id="4192273449750167573">تنظیماتتان را در صفحه بعد مرور کنید</translation>
 <translation id="4193154014135846272">‏سند Google </translation>
 <translation id="4194570336751258953">فعال کردن ضربه بجای کلیک</translation>
+<translation id="4195249722193633765">‏نصب برنامه با Linux (بتا)</translation>
 <translation id="4195643157523330669">باز کردن در برگهٔ جدید</translation>
 <translation id="4195814663415092787">ادامه از جایی که ترک کردید</translation>
 <translation id="4197674956721858839">انتخاب فایل‌های فشرده</translation>
@@ -2150,7 +2167,9 @@
 <translation id="428608937826130504">مورد ۸ قفسه</translation>
 <translation id="4287502004382794929">به اندازه‌ کافی مجوز نرم‌افزار برای ثبت‌نام این دستگاه ندارید. لطفاً با مرکز فروش برای خرید بیشتر تماس بگیرید. اگر اعتقاد دارید که این پیام به اشتباه برای شما نشان داده شده است، لطفاً با مرکز پشتیبانی تماس بگیرید.</translation>
 <translation id="4289540628985791613">مرور کلی</translation>
+<translation id="4295072614469448764">برنامه در «ترمینال» دردسترس است. ممکن است در «راه‌انداز» هم نمادی وجود داشته باشد.</translation>
 <translation id="4296575653627536209">افزودن کاربر تحت نظارت</translation>
+<translation id="4297219207642690536">بازراه‌اندازی و بازنشانی</translation>
 <translation id="4297322094678649474">تغییر زبان‌ها</translation>
 <translation id="4300305918532693141">برای تغییر این تنظیم، <ph name="BEGIN_LINK" />همگام‌سازی را بازنشانی کنید<ph name="END_LINK" />.</translation>
 <translation id="4305227814872083840">طولانی (۲ ثانیه)</translation>
@@ -2186,6 +2205,7 @@
 <translation id="4370975561335139969">ایمیل و گذرواژه‌ای که وارد کرده‌اید، مطابقت ندارند</translation>
 <translation id="437184764829821926">تنظیمات پیشرفته قلم</translation>
 <translation id="4372884569765913867">۱x۱</translation>
+<translation id="4374831787438678295">‏نصب‌کننده Linux</translation>
 <translation id="4375035964737468845">باز کردن فایل‌های بارگیری‌شده</translation>
 <translation id="4377363674125277448">مشکلی در رابطه با گواهی سرور پیش آمد.</translation>
 <translation id="4378154925671717803">تلفن</translation>
@@ -2304,6 +2324,7 @@
 <translation id="4576541033847873020">مرتبط‌سازی دستگاه بلوتوث</translation>
 <translation id="4579581181964204535">ارسال محتوای <ph name="HOST_NAME" /> امکان‌پذیر نیست.</translation>
 <translation id="4580526846085481512">آیا مطمئنید می‌خواهید موارد $1 را حذف کنید؟</translation>
+<translation id="4582497162516204941">‏نصب با Linux (بتا)</translation>
 <translation id="4582563038311694664">بازنشانی همه تنظیمات</translation>
 <translation id="4585793705637313973">ویرایش صفحه</translation>
 <translation id="4589268276914962177">پایانه جدید</translation>
@@ -2547,6 +2568,7 @@
 <translation id="4953808748584563296">چهره‌نمای پیش‌فرض نارنجی</translation>
 <translation id="4955814292505481804">سالانه</translation>
 <translation id="4957949153200969297">فقط ویژگی‌های مربوط به همگام‌سازی <ph name="IDS_SHORT_PRODUCT_NAME" /> فعال می‌شود</translation>
+<translation id="4959262764292427323">‏گذرواژه‌ها در حساب Google شما ذخیره می‌شود تا بتوانید در همه دستگاه‌هایتان از آن‌ها استفاده کنید</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation>
 <translation id="496226124210045887">پوشه‌ای که انتخاب کرده‌اید حاوی فایل‌های حساسی است. آیا مطمئنید که می‌خواهید به «$1» دسترسی دائم خواندن این پوشه را اعطا کنید؟</translation>
 <translation id="4964455510556214366">ترتیب</translation>
@@ -2726,6 +2748,7 @@
 <translation id="5240817131241497236">‏تنظیماتی که همگام‌سازی، شخصی‌سازی و سرویس‌های دیگر Google در Chrome را کنترل می‌کند تغییر کرده است. این تغییر ممکن است روی تنظیمات فعلی تأثیر گذارد.</translation>
 <translation id="5241128660650683457">خواندن همه داده‌هایتان در وب‌سایت‌هایی که بازدید می‌کنید</translation>
 <translation id="5242724311594467048">«<ph name="EXTENSION_NAME" />» فعال شود؟</translation>
+<translation id="5243522832766285132">چند لحظه دیگر دوباره امتحان کنید</translation>
 <translation id="5244474230056479698">درحال همگام‌سازی در <ph name="EMAIL" /></translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> خراب شده است. برای راه‌اندازی مجدد برنامه بر روی این بالون کلیک کنید.</translation>
 <translation id="5247051749037287028">نام نمایشی (اختیاری)</translation>
@@ -2748,6 +2771,7 @@
 <translation id="5264148714798105376">ممکن است یک دقیقه یا بیشتر طول بکشد.</translation>
 <translation id="5264252276333215551">برای راه‌اندازی برنامه‌تان در حالت کیوسک لطفاً به اینترنت متصل شوید.</translation>
 <translation id="5265562206369321422">آفلاین برای مدت بیش از یک هفته</translation>
+<translation id="5265797726250773323">هنگام نصب خطایی روی داد</translation>
 <translation id="5266113311903163739">خطای ورود ارائه دهنده مجوز</translation>
 <translation id="5269977353971873915">چاپ نشد</translation>
 <translation id="5271549068863921519">ذخیره گذرواژه</translation>
@@ -2770,6 +2794,7 @@
 <translation id="529175790091471945">قالب‌بندی این دستگاه</translation>
 <translation id="5292195676005197571">برای استفاده از اکثر کلیدها، تنها کافی است دکمه را فشار دهید</translation>
 <translation id="5293170712604732402">بازنشانی تنظیمات به پیش‌فرض‌های اولیه آن‌ها</translation>
+<translation id="5297082477358294722">گذرواژه ذخیره شد. گذرواژه‌های ذخیره‌شده‌تان را در <ph name="SAVED_PASSWORDS_STORE" /> مشاهده و مدیریت کنید.</translation>
 <translation id="5298219193514155779">ایحاد طرح زمینه توسط</translation>
 <translation id="5299109548848736476">ردیابی نشود</translation>
 <translation id="5299682071747318445">تمام داده‌ها با رمز عبارتی همگام‌سازی شما رمزگذاری شده‌اند</translation>
@@ -2998,6 +3023,7 @@
 <translation id="5612720917913232150"><ph name="URL" /> می‌خواهد از موقعیت مکانی رایانه شما استفاده کند</translation>
 <translation id="5612734644261457353">متأسفیم، تأیید گذرواژه شما همچنان امکان‌پذیر نیست. اگر به‌تازگی گذرواژه خود را تغییر داده‌اید، گذرواژه جدید شما هنگامی‌که از سیستم خارج شدید، اعمال می‌شود؛ لطفاً اینجا از گذرواژه قدیمی خود استفاده کنید.</translation>
 <translation id="5614190747811328134">اعلامیه کاربر</translation>
+<translation id="5614553682702429503">گذرواژه ذخیره شود؟</translation>
 <translation id="561698261642843490">‏بستن Firefox</translation>
 <translation id="5618075537869101857">وای، برنامه کاربردی کیوسک راه‌اندازی نشد.</translation>
 <translation id="5618333180342767515">(این مرحله ممکن است چند دقیقه طول بکشد)</translation>
@@ -3038,6 +3064,7 @@
 <translation id="5677503058916217575">زبان صفحه:</translation>
 <translation id="5677928146339483299">مسدود است</translation>
 <translation id="5678550637669481956">مجوز خواندن و نوشتن در <ph name="VOLUME_NAME" /> داده شد.</translation>
+<translation id="5678784840044122290">‏برنامه Linux در «ترمینال» دردسترس خواهد بود و ممکن است در «راه‌انداز» هم نمادی نشان داده شود.</translation>
 <translation id="5678955352098267522">خواندن داده‌های شما در <ph name="WEBSITE_1" /></translation>
 <translation id="5684661240348539843">شناسه دارایی</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />ارتباط با بایگانی یا دیسک مجازی نمی‌تواند قطع شود<ph name="END_BOLD" />
@@ -3133,6 +3160,7 @@
 <translation id="5832805196449965646">افزودن شخص</translation>
 <translation id="583281660410589416">ناشناس</translation>
 <translation id="5832976493438355584">قفل شده است</translation>
+<translation id="5833397272224757657">از محتوای سایت‌هایی که بازدید می‌کنید و فعالیت و تعاملات مرورگر برای شخصی‌سازی استفاده می‌کند</translation>
 <translation id="5833610766403489739">این فایل در جایی سرگردان شده است. لطفاً تنظیم محل دانلودتان را بررسی کنید و دوباره امتحان کنید.</translation>
 <translation id="5833726373896279253">این تنظیمات فقط توسط مالک قابل تغییر هستند:</translation>
 <translation id="5834581999798853053">حدود <ph name="TIME" /> دقیقه باقی مانده است</translation>
@@ -3186,6 +3214,7 @@
 <translation id="5908769186679515905">‏اجرای Flash در سایت‌ها مسدود شود</translation>
 <translation id="5910363049092958439">ذ&amp;خیره فایل تصویری به‌عنوان...</translation>
 <translation id="5911737117543891828">‏فایل‌های آفلاین موقت Google Drive حذف خواهند شد. فایل‌هایی که به‌عنوان «در دسترس به‌صورت آفلاین» تنظیم کرده‌اید، از این دستگاه حذف نخواهند شد.</translation>
+<translation id="5911887972742538906">‏هنگام نصب برنامه Linux خطایی روی داد.</translation>
 <translation id="5912378097832178659">&amp;ویرایش موتورهای جستجو...</translation>
 <translation id="5914724413750400082">مدول (<ph name="MODULUS_NUM_BITS" /> بیت):
   <ph name="MODULUS_HEX_DUMP" />
@@ -3372,6 +3401,7 @@
 <translation id="6198102561359457428">خارج شده و دوباره وارد سیستم شوید...</translation>
 <translation id="6198252989419008588">تغییر دادن پین</translation>
 <translation id="6199801702437275229">منتظر اطلاعات فضا...</translation>
+<translation id="6201792273624501289">‏برنامه‌های Linux</translation>
 <translation id="6204015976622790023">دیدن پیشنهادهایی از «دستیار» که مرتبط با محتوای صفحه‌تان است.</translation>
 <translation id="6205710420833115353">برخی از کارکردها بیشتر از انتظار طول می‌کشند. می‌خواهید از آنها صرف‌نظر کنید؟</translation>
 <translation id="6206311232642889873">&amp;کپی تصویر</translation>
@@ -3848,6 +3878,7 @@
 <translation id="6945221475159498467">انتخاب</translation>
 <translation id="694592694773692225">در این صفحه، هدایت کردن مسدود شده است.</translation>
 <translation id="6949306908218145636">نشانک‌گذاری صفحه‌های باز...</translation>
+<translation id="6950627417367801484">بازیابی برنامه‌ها</translation>
 <translation id="6951153907720526401">کنترل‌کننده‌های پرداخت</translation>
 <translation id="6955446738988643816">بازرسی پنجره بازشو</translation>
 <translation id="6957231940976260713">نام سرویس</translation>
@@ -3973,6 +4004,7 @@
 <translation id="7127980134843952133">سابقه بارگیری</translation>
 <translation id="7131040479572660648">خواندن داده‌های شما در <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" /> و <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">افزودن &amp;صفحه...</translation>
+<translation id="7133578150266914903">سرپرست درحال عقب‌گرد کردن این دستگاه است (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="7134098520442464001">متن را کوتاهتر کنید</translation>
 <translation id="7136694880210472378">پیش‌فرض قرار دادن</translation>
 <translation id="7136984461011502314">به <ph name="PRODUCT_NAME" /> خوش آمدید</translation>
@@ -4173,6 +4205,7 @@
 <translation id="7463006580194749499">افزودن شخص</translation>
 <translation id="7464490149090366184">فشرده نشد، مورد وجود ندارد: «$1»</translation>
 <translation id="7465778193084373987">‏نشانی وب ابطال گواهی Netscape</translation>
+<translation id="7469406957790636836">برای روشن کردن این گزینه، ابتدا غلط‌گیر املا را در <ph name="BEGIN_LINK" />زبان‌ها و ورودی<ph name="END_LINK" /> روشن کنید</translation>
 <translation id="7469894403370665791">اتصال به این شبکه به صورت خودکار</translation>
 <translation id="747114903913869239">خطا: رمزگشایی برنامهٔ افزودنی ممکن نیست</translation>
 <translation id="7473753388963818366">بیایید <ph name="DEVICE_TYPE" /> را برایتان آماده کنیم</translation>
@@ -4270,6 +4303,7 @@
 <translation id="7606992457248886637">منابع موثق</translation>
 <translation id="7607002721634913082">متوقف</translation>
 <translation id="7607274158153386860">درخواست سایت رایانه لوحی</translation>
+<translation id="7609148976235050828">لطفاً به اینترنت متصل شوید و دوباره امتحان کنید.</translation>
 <translation id="7611008212562900400">جستجوی دستگاه، برنامه‌، وب…</translation>
 <translation id="7616214729753637086">درحال ثبت دستگاه...</translation>
 <translation id="7617366389578322136">اتصال به «<ph name="DEVICE_NAME" />»</translation>
@@ -4338,6 +4372,7 @@
 <translation id="7730449930968088409">ثبت محتوا از صفحه شما</translation>
 <translation id="7730494089396812859">‏نمایش جزئیات پشتیبان‌گیری Cloud</translation>
 <translation id="7732111077498238432">شبکه توسط خط‌مشی کنترل می‌شود</translation>
+<translation id="7737238973539693982">‏حذف Linux (بتا)</translation>
 <translation id="773905249182896430">از شما و دستگاهتان دربرابر سایت‌های خطرناک محافظت می‌کند</translation>
 <translation id="7740996059027112821">استاندارد</translation>
 <translation id="7748528009589593815">برگه قبلی</translation>
@@ -4526,6 +4561,7 @@
 <translation id="7974936243149753750">تصویر بزرگ‌تر از صفحه</translation>
 <translation id="7977551819349545646">‏در حال به‌روزرسانی Chromebox...</translation>
 <translation id="7978412674231730200">کلید خصوصی</translation>
+<translation id="7978450511781612192">‏با این کار از سیستم حساب Google خود خارج می‌شوید. نشانک‌ها، سابقه، گذرواژه‌ها و سایر موارد دیگر همگام‌سازی نمی‌شوند.</translation>
 <translation id="7979036127916589816">خطای همگام‌سازی</translation>
 <translation id="7980084013673500153">شناسه دارایی: <ph name="ASSET_ID" /></translation>
 <translation id="7981313251711023384">پیش‌بارگیری صفحه‌ها برای مرور و جستجوی سریع‌تر</translation>
@@ -4572,6 +4608,7 @@
 <translation id="8028993641010258682">اندازه</translation>
 <translation id="8030656706657716245">افزودن چاپگر</translation>
 <translation id="8032244173881942855">ارسال محتوای برگه امکان‌پذیر نیست.</translation>
+<translation id="8033827949643255796">انتخاب شد</translation>
 <translation id="8033958968890501070">پایان مهلت زمانی</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{باز کردن همه در پنجره ناشناس}=1{باز کردن در پنجره ناشناس}one{باز کردن همه (#) در پنجره ناشناس}other{باز کردن همه (#) در پنجره ناشناس}}</translation>
 <translation id="8037117027592400564">خواندن همه نوشتار با استفاده از گفتار تجزیه و تحلیل شده</translation>
@@ -4690,6 +4727,7 @@
 <translation id="8226619461731305576">صف</translation>
 <translation id="8226742006292257240">‏در زیر گذرواژه TPM ایجاد شده به صورت تصادفی، آورده شده که به رایانهٔ شما اختصاص داده شده است:</translation>
 <translation id="8227119283605456246">پیوست کردن فایل</translation>
+<translation id="8230134520748321204">گذرواژه <ph name="ORIGIN" /> ذخیره شود؟</translation>
 <translation id="8234795456569844941">لطفاً در رفع این مشکل به مهندسان ما کمک کنید. بگویید درست قبل از اینکه پیام خطای نمایه را دریافت کنید، چه اتفاقی افتاد.</translation>
 <translation id="8234989666557591529">برای باز کردن قفل <ph name="DEVICE_TYPE" />، یک تلفن انتخاب کنید</translation>
 <translation id="8239020549147958415">همگام‌سازی به‌عنوان <ph name="FULL_NAME" /></translation>
@@ -4808,6 +4846,7 @@
 <translation id="8438328416656800239">به مرورگر هوشمندی جابه‌جا شوید</translation>
 <translation id="8438566539970814960">بهبود جستجوها و مرور</translation>
 <translation id="8439506636278576865">ترجمه صفحات نوشته شده به این زبان پیشنهاد داده شود</translation>
+<translation id="8440630305826533614">‏برنامه‌های Linux</translation>
 <translation id="8446884382197647889">بیشتر بیاموزید</translation>
 <translation id="8447409163267621480">‏باید شامل Ctrl یا Alt باشد</translation>
 <translation id="8448729345478502352">بزرگ‌تر با کوچک‌تر کردن موارد روی صفحه</translation>
@@ -4852,6 +4891,7 @@
 <translation id="8497219075884839166">‏امکانات WIndows</translation>
 <translation id="8498214519255567734">نگاه کردن به صفحه یا خواندن در نور کم را آسان‌تر می‌کند</translation>
 <translation id="8498395510292172881">‏ادامه خواندن در Chrome</translation>
+<translation id="8502536196501630039">‏برای استفاده از برنامه‌های Google Play، ابتدا باید برنامه‌هایتان را بازیابی کنید. ممکن است برخی از داده‌ها از دست رفته باشد.</translation>
 <translation id="8503813439785031346">نام کاربری</translation>
 <translation id="850875081535031620">نرم‌افزار مضری پیدا نشد</translation>
 <translation id="8509646642152301857">بارگیری واژه‌نامه بررسی املا انجام نشد.</translation>
@@ -4861,7 +4901,6 @@
 <translation id="8523493869875972733">حفظ تغییرات</translation>
 <translation id="8523849605371521713">به‌موجب خط‌مشی اضافه شد</translation>
 <translation id="8525306231823319788">تمام صفحه</translation>
-<translation id="8525982673980740788">‏افزودن ویژگی‌های جدید که از اتصال تلفن به Chromebook استفاده می‌کند</translation>
 <translation id="8528074251912154910">افزودن زبان</translation>
 <translation id="8528962588711550376">ورود به برنامه.</translation>
 <translation id="8529026713753283969">در این تلفن اعلانی دریافت می‌کنید، بنابراین آن را همین اطراف نگه‌دارید.</translation>
@@ -4981,6 +5020,7 @@
 <translation id="8698464937041809063">‏طراحی Google </translation>
 <translation id="869884720829132584">منوی برنامه</translation>
 <translation id="869891660844655955">تاریخ انقضا</translation>
+<translation id="8699566574894671540">برای روشن کردن این گزینه، ابتدا «بررسی املا هنگام تایپ» را در «منوی ویرایش» روشن کنید</translation>
 <translation id="870073306461175568">Network File Shares</translation>
 <translation id="8701677791353449257">نام دستگاه باید با عبارت باقاعده <ph name="REGEX" /> مطابقت داشته باشد.</translation>
 <translation id="8704521619148782536">این کار بیشتر از زمان معمول طول کشیده است. می‌توانید منتظر بمانید یا آن را لغو کرده و بعداً دوباره امتحان کنید.</translation>
@@ -5020,6 +5060,7 @@
 
         &lt;p&gt;اما هنوز شما می‌توانید از طریق خط فرمان پیکربندی کنید. لطفاً برای کسب اطلاعات بیشتر درباره متغیرهای محیط و پرچم‌ها به &lt;code&gt;راهنمای‏ <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; مراجعه کنید.&lt;/p&gt;</translation>
 <translation id="8755376271068075440">&amp;بزرگ تر</translation>
+<translation id="8756969031206844760">گذرواژه به‌روزرسانی شود؟</translation>
 <translation id="8757090071857742562">ارسال محتوای دسک‌تاپ امکان‌پذیر نیست. ببینید آیا فرمان شروع اشتراک‌گذاری صفحه‌تان را تأیید کرده‌اید.</translation>
 <translation id="8757640015637159332">ورود به جلسه عمومی</translation>
 <translation id="8757742102600829832">‏یک Chromebox برای ارتباط با این دستگاه انتخاب کنید</translation>
@@ -5176,7 +5217,9 @@
 <translation id="9009369504041480176">در حال بارگذاری کردن (%<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="9011163749350026987">نماد همیشه نشان داده شود</translation>
 <translation id="9011178328451474963">آخرین برگه</translation>
+<translation id="9013707997379828817">سرپرست این دستگاه را عقب‌گرد کرد. لطفاً فایل‌های مهم را ذخیره کنید، سپس دستگاه را بازراه‌اندازی کنید. همه داده‌های دستگاه حذف می‌شود.</translation>
 <translation id="9014987600015527693">نمایش یک تلفن دیگر</translation>
+<translation id="9018218886431812662">نصب کامل شد</translation>
 <translation id="901834265349196618">ایمیل</translation>
 <translation id="9019062154811256702">خواندن و تغییر تنظیمات تکمیل خودکار</translation>
 <translation id="9020362265352758658">۴ برابر</translation>
@@ -5200,6 +5243,7 @@
 <translation id="9038649477754266430">استفاده از یک سرویس پیش‌بینی برای بار کردن سریع‌تر صفحه‌ها</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9039890312082871605">بی‌صدا کردن برگه‌ها</translation>
+<translation id="9040661932550800571">گذرواژه <ph name="ORIGIN" /> به‌روزرسانی شود؟</translation>
 <translation id="9041692268811217999">دسترسی به فایل‌های محلی موجود در دستگاهتان، توسط سرپرست شما غیرفعال شده است</translation>
 <translation id="9042893549633094279">حریم خصوصی و امنیت</translation>
 <translation id="904451693890288097">لطفاً کلیدواژه را برای "<ph name="DEVICE_NAME" />" وارد کنید:</translation>
@@ -5304,6 +5348,7 @@
 <translation id="9203478404496196495">وصل کردن صدای برگه</translation>
 <translation id="9203904171912129171">انتخاب دستگاه</translation>
 <translation id="9203962528777363226">سرپرست این دستگاه امکان افزوده شدن کاربران جدید را غیرفعال کرده است</translation>
+<translation id="9213073329713032541">نصب باموفقیت شروع شد.</translation>
 <translation id="9214520840402538427">متأسفیم! مهلت مقداردهی اولیه از ویژگی‌های زمان نصب به پایان رسیده است. لطفاً با نماینده پشتیبانی خود تماس بگیرید.</translation>
 <translation id="9214695392875603905">کیک فنجانی</translation>
 <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" اضافه شد</translation>
@@ -5358,6 +5403,7 @@
 <translation id="988978206646512040">عبارت عبور خالی مجاز نیست</translation>
 <translation id="992032470292211616">افزودنی‌ها، برنامه‌ها و طرح‌های زمینه می‌توانند به دستگاه شما آسیب برسانند. آیا مطمئن هستید که می‌خواهید ادامه دهید؟</translation>
 <translation id="992592832486024913">‏غیرفعال کردن ChromeVox (بازخورد گفتاری)</translation>
+<translation id="993540765962421562">نصب درحال انجام است.</translation>
 <translation id="994289308992179865">&amp;حلقه</translation>
 <translation id="996250603853062861">در حال برقراری اتصال ایمن...</translation>
 <translation id="998747458861718449">بازرسی</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 418747bd..7cd14ec1 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1783,7 +1783,6 @@
 <translation id="3688507211863392146">Kirjoittaa sovelluksessa avaamiisi tiedostoihin ja kansioihin.</translation>
 <translation id="3688526734140524629">Vaihda kanavaa</translation>
 <translation id="3688578402379768763">Ajan tasalla</translation>
-<translation id="3691214267321877444">Maksutavat ja osoitteet Google Paysta</translation>
 <translation id="3691231116639905343">Näppäimistösovellukset</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> haluaa jakaa laitteesi näytön.</translation>
 <translation id="3693415264595406141">Salasana:</translation>
@@ -1855,7 +1854,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Näytä Apps-oikopolku</translation>
 <translation id="3785727820640310185">Tämän sivuston tallennetut salasanat</translation>
-<translation id="3785852283863272759">Lähetä sivun sijainti sähköpostitse</translation>
 <translation id="3786301125658655746">Olet offline-tilassa</translation>
 <translation id="3788401245189148511">Se voisi:</translation>
 <translation id="3789841737615482174">Asenna</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Ladattu kohteesta:</translation>
 <translation id="7180611975245234373">Päivitä</translation>
 <translation id="7180865173735832675">Muokkaa</translation>
+<translation id="7182359331070524176">Valitse Google Kuvien albumi</translation>
 <translation id="7186088072322679094">Pidä yläpalkissa</translation>
 <translation id="7187428571767585875">Poistettavat tai muutettavat rekisteritiedot:</translation>
 <translation id="7189234443051076392">Varmista, että laitteellasi on tarpeeksi tilaa.</translation>
@@ -4613,6 +4612,7 @@
 <translation id="8028993641010258682">Koko</translation>
 <translation id="8030656706657716245">Lisää tulostin</translation>
 <translation id="8032244173881942855">Välilehden suoratoisto ei onnistu</translation>
+<translation id="8033827949643255796">valittu</translation>
 <translation id="8033958968890501070">Aikakatkaisu</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Avaa kaikki incognito-ikkunassa}=1{Avaa incognito-ikkunassa}other{Avaa kaikki # incognito-ikkunassa}}</translation>
 <translation id="8037117027592400564">Käyttää kaikkea puhesynteesin avulla luettua tekstiä</translation>
@@ -4905,7 +4905,6 @@
 <translation id="8523493869875972733">Säilytä muutokset</translation>
 <translation id="8523849605371521713">Käytännön lisäämä</translation>
 <translation id="8525306231823319788">Koko näyttö</translation>
-<translation id="8525982673980740788">Lisätä uusia ominaisuuksia, jotka käyttävät puhelimen Chromebook-yhteyttä</translation>
 <translation id="8528074251912154910">Lisää kieliä</translation>
 <translation id="8528962588711550376">Kirjaudutaan.</translation>
 <translation id="8529026713753283969">Saat ilmoituksen tähän puhelimeen, joten pidä puhelin käden ulottuvilla.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index b1c4e162..4366404e 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Mag-write sa mga file at folder na iyong bubuksan sa application</translation>
 <translation id="3688526734140524629">Lumipat ng channel</translation>
 <translation id="3688578402379768763">Napapanahon</translation>
-<translation id="3691214267321877444">Mga paraan ng pagbabayad at address gamit ang Google Pay.</translation>
 <translation id="3691231116639905343">Mga keyboard app</translation>
 <translation id="3691267899302886494">Gustong ibahagi ng <ph name="HOST" /> ang iyong screen</translation>
 <translation id="3693415264595406141">Password:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Ipakita ang Shortcut ng Apps</translation>
 <translation id="3785727820640310185">Mga naka-save na password para sa site na ito</translation>
-<translation id="3785852283863272759">Email Page Location</translation>
 <translation id="3786301125658655746">Naka-offline ka</translation>
 <translation id="3788401245189148511">Maaari itong:</translation>
 <translation id="3789841737615482174">Mag-install</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">Laki</translation>
 <translation id="8030656706657716245">Magdagdag ng Printer</translation>
 <translation id="8032244173881942855">Hindi ma-cast ang tab.</translation>
+<translation id="8033827949643255796">pinili</translation>
 <translation id="8033958968890501070">Time out</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Buksan lahat sa &amp;incognito window}=1{Buksan lahat sa &amp;incognito window}one{Buksan lahat (#) sa &amp;incognito window}other{Buksan lahat (#) sa &amp;incognito window}}</translation>
 <translation id="8037117027592400564">Basahin ang lahat ng binigkas na text gamit ang naka-synthesize na pagsasalita</translation>
@@ -4907,7 +4906,6 @@
 <translation id="8523493869875972733">Panatilihin ang Mga Pagbabago</translation>
 <translation id="8523849605371521713">Idinagdag ng patakaran</translation>
 <translation id="8525306231823319788">Buong screen</translation>
-<translation id="8525982673980740788">Magdagdag ng mga bagong feature na gumagamit ng koneksyon ng iyong telepono sa Chromebook mo</translation>
 <translation id="8528074251912154910">Magdagdag ng mga wika</translation>
 <translation id="8528962588711550376">Nagsa-sign in.</translation>
 <translation id="8529026713753283969">Makakatanggap ka ng notification sa teleponong ito kaya panatilihing nasa malapit ito.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index de6774e1..c8f60e9 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1768,7 +1768,6 @@
 <translation id="3688507211863392146">Accéder en écriture aux fichiers et aux dossiers ouverts dans l'application</translation>
 <translation id="3688526734140524629">Changer de version</translation>
 <translation id="3688578402379768763">Mise à jour effectuée</translation>
-<translation id="3691214267321877444">Modes de paiement et adresses utilisés dans Google Pay.</translation>
 <translation id="3691231116639905343">Applications de clavier</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> souhaite partager votre écran</translation>
 <translation id="3693415264595406141">Mot de passe :</translation>
@@ -1839,7 +1838,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Afficher le raccourci des applications</translation>
 <translation id="3785727820640310185">Mots de passe enregistrés pour ce site</translation>
-<translation id="3785852283863272759">Envoyer par e-mail l'emplacement de la page</translation>
 <translation id="3786301125658655746">Vous êtes actuellement hors connexion.</translation>
 <translation id="3788401245189148511">Elle pourrait :</translation>
 <translation id="3789841737615482174">Installer</translation>
@@ -4577,6 +4575,7 @@
 <translation id="8028993641010258682">Taille</translation>
 <translation id="8030656706657716245">Ajouter une imprimante</translation>
 <translation id="8032244173881942855">Impossible de caster l'onglet.</translation>
+<translation id="8033827949643255796">sélectionné</translation>
 <translation id="8033958968890501070">Délai dépassé</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Tout ouvrir dans une fenêtre de navigation &amp;privée}=1{Ouvrir dans une fenêtre de navigation &amp;privée}one{Tout ouvrir (#) dans une fenêtre de navigation &amp;privée}other{Tout ouvrir (#) dans une fenêtre de navigation &amp;privée}}</translation>
 <translation id="8037117027592400564">Accéder à l'ensemble du texte énoncé à l'aide de la synthèse vocale</translation>
@@ -4866,7 +4865,6 @@
 <translation id="8523493869875972733">Conserver les modifications</translation>
 <translation id="8523849605371521713">Ajoutée en raison des règles</translation>
 <translation id="8525306231823319788">Plein écran</translation>
-<translation id="8525982673980740788">Ajoutez de nouvelles fonctionnalités s'appuyant sur l'association de votre téléphone à votre Chromebook</translation>
 <translation id="8528074251912154910">Ajouter des langues</translation>
 <translation id="8528962588711550376">Connexion en cours</translation>
 <translation id="8529026713753283969">Vous recevrez une notification sur votre téléphone. Gardez-le donc à proximité.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index c20f2856..3c897519 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1778,7 +1778,6 @@
 <translation id="3688507211863392146">તમે એપ્લિકેશનમાં ખોલી છે તે ફાઇલો અને ફોલ્ડર્સમાં લખો</translation>
 <translation id="3688526734140524629">ચેનલ બદલો</translation>
 <translation id="3688578402379768763">અપ-ટુ-ડેટ</translation>
-<translation id="3691214267321877444">Google Payનો ઉપયોગ કરતી ચુકવણી પદ્ધતિ અને ઍડ્રેસ.</translation>
 <translation id="3691231116639905343">કીબોર્ડ ઍપ</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> તમારી સ્ક્રીન શેર કરવા માગે છે</translation>
 <translation id="3693415264595406141">પાસવર્ડ:</translation>
@@ -1850,7 +1849,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">ઍપ્લિકેશનો શોર્ટકટ બતાવો</translation>
 <translation id="3785727820640310185">આ સાઇટ માટે પાસવર્ડ સાચવેલા છે</translation>
-<translation id="3785852283863272759">પૃષ્ઠ સ્થાન ઇમેઇલ કરો</translation>
 <translation id="3786301125658655746">તમે ઑફલાઇન છો</translation>
 <translation id="3788401245189148511">તે આ કરી શકે છે:</translation>
 <translation id="3789841737615482174">ઇન્સ્ટોલ કરો</translation>
@@ -4606,6 +4604,7 @@
 <translation id="8028993641010258682">કદ</translation>
 <translation id="8030656706657716245">પ્રિન્ટર ઉમેરો</translation>
 <translation id="8032244173881942855">ટૅબને કાસ્ટ કરવામાં અસમર્થ.</translation>
+<translation id="8033827949643255796">પસંદ કરેલ</translation>
 <translation id="8033958968890501070">સમયસમાપ્તિ</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{તમામ URLને &amp;છુપી વિંડોમાં ખોલો}=1{URLને &amp;છુપી વિંડોમાં ખોલો}one{તમામ (#) URLને છુપી વિંડોમાં ખોલો}other{તમામ (#) URLને છુપી વિંડોમાં ખોલો}}</translation>
 <translation id="8037117027592400564">સિન્થેસાઇઝ કરેલ વાણીનો ઉપયોગ કરીને બધી બોલાયેલ ટેક્સ્ટને વાંચો</translation>
@@ -4898,7 +4897,6 @@
 <translation id="8523493869875972733">ફેરફારો રાખો</translation>
 <translation id="8523849605371521713">નીતિ દ્વારા ઉમેરાયેલ</translation>
 <translation id="8525306231823319788">પૂર્ણ સ્ક્રીન</translation>
-<translation id="8525982673980740788">તમારી Chromebook પર તમારા ફોનના કનેક્શનનો ઉપયોગ કરે તેવી નવી સુવિધાઓ ઉમેરો</translation>
 <translation id="8528074251912154910">ભાષાઓ ઉમેરો</translation>
 <translation id="8528962588711550376">સાઇન ઇન થઈ રહ્યું છે.</translation>
 <translation id="8529026713753283969">તમને આ ફોન પર એક નોટિફિકેશન મળશે, તેથી ફોન નજીકમાં રાખજો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 5366524..8a6b57d 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">आपके द्वारा ऐप्लिकेशन में खोली गईं फ़ाइलों और फ़ोल्डर में लिखें</translation>
 <translation id="3688526734140524629">चैनल बदलें</translation>
 <translation id="3688578402379768763">अद्यतित</translation>
-<translation id="3691214267321877444">Google Pay का इस्तेमाल करने वाले भुगतान के तरीके और पते</translation>
 <translation id="3691231116639905343">कीबोर्ड ऐप्लिकेशन</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> आपकी स्क्रीन शेयर करना चाहता है</translation>
 <translation id="3693415264595406141">पासवर्ड:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">ऐप्स  शॉर्टकट दिखाएं</translation>
 <translation id="3785727820640310185">इस साइट के लिए सेव किए गए पासवर्ड</translation>
-<translation id="3785852283863272759">पेज स्थान ईमेल करें</translation>
 <translation id="3786301125658655746">आप ऑफ़लाइन हैं</translation>
 <translation id="3788401245189148511">यह निम्न कर सकता है:</translation>
 <translation id="3789841737615482174">इंस्‍टॉल करें</translation>
@@ -4613,6 +4611,7 @@
 <translation id="8028993641010258682">आकार</translation>
 <translation id="8030656706657716245">प्रिंटर जोड़ें</translation>
 <translation id="8032244173881942855">टैब कास्ट करने में असमर्थ.</translation>
+<translation id="8033827949643255796">चयनित</translation>
 <translation id="8033958968890501070">समय खत्म</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{सभी को &amp;गुप्त विंडो में खोलें}=1{&amp;गुप्त विंडों में खोलें}one{सभी (#) को &amp;गुप्त विंडो में खोलें}other{सभी (#) को &amp;गुप्त विंडो में खोलें}}</translation>
 <translation id="8037117027592400564">संश्लेषित बोली का उपयोग करके बोला गया सभी लेख पढ़ें</translation>
@@ -4905,7 +4904,6 @@
 <translation id="8523493869875972733">बदलावों को बनाए रखें</translation>
 <translation id="8523849605371521713">पॉलिसी द्वारा जोड़ा गया</translation>
 <translation id="8525306231823319788">पूर्ण स्‍क्रीन</translation>
-<translation id="8525982673980740788">आपके Chromebook में नई सुविधाएं जोड़ सकती है. ये सुविधाएं आपके फ़ोन के कनेक्शन का इस्तेमाल करती हैं.</translation>
 <translation id="8528074251912154910">भाषाएं जोड़ें</translation>
 <translation id="8528962588711550376">प्रवेश कर रहा है.</translation>
 <translation id="8529026713753283969">आपको इस फ़ोन पर एक नोटिफ़िकेशन मिलेगा इसलिए फ़ोन आस-पास ही रखें.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index e895696..f12cccb 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">pisati u datoteke i mape koje otvorite u aplikaciji</translation>
 <translation id="3688526734140524629">Promijeni kanal</translation>
 <translation id="3688578402379768763">Ažurno</translation>
-<translation id="3691214267321877444">Načini plaćanja i adrese s Google Paya.</translation>
 <translation id="3691231116639905343">Tipkovnice</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> želi podijeliti vaš zaslon</translation>
 <translation id="3693415264595406141">Zaporka:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Prikaži prečac za Aplikacije</translation>
 <translation id="3785727820640310185">Spremljene zaporke za tu web-lokaciju</translation>
-<translation id="3785852283863272759">Lokacija stranice e-pošte</translation>
 <translation id="3786301125658655746">Izvan mreže ste</translation>
 <translation id="3788401245189148511">Proširenje ili aplikacija mogli bi:</translation>
 <translation id="3789841737615482174">Instaliraj</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Učitano iz:</translation>
 <translation id="7180611975245234373">Osvježi</translation>
 <translation id="7180865173735832675">Prilagodi</translation>
+<translation id="7182359331070524176">Odaberite album Google fotografija</translation>
 <translation id="7186088072322679094">Zadrži na alatnoj traci</translation>
 <translation id="7187428571767585875">Unosi registra koje treba ukloniti ili promijeniti:</translation>
 <translation id="7189234443051076392">Provjerite ima li dovoljno prostora na uređaju</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Veličina</translation>
 <translation id="8030656706657716245">Dodajte pisač</translation>
 <translation id="8032244173881942855">Emitiranje kartice nije moguće.</translation>
+<translation id="8033827949643255796">odabrano</translation>
 <translation id="8033958968890501070">Vrijeme je isteklo</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Otvori sve u &amp;anonimnom prozoru}=1{Otvori u &amp;anonimnom prozoru}one{Otvori sve (#) u &amp;anonimnom prozoru}few{Otvori sve (#) u &amp;anonimnom prozoru}other{Otvori sve (#) u &amp;anonimnom prozoru}}</translation>
 <translation id="8037117027592400564">čitati sve tekstove izgovorene sintetiziranim govorom</translation>
@@ -4907,7 +4907,6 @@
 <translation id="8523493869875972733">Zadrži promjene</translation>
 <translation id="8523849605371521713">Dodala pravila</translation>
 <translation id="8525306231823319788">Cijeli zaslon</translation>
-<translation id="8525982673980740788">Dodajte nove značajke koje upotrebljavaju vezu telefona s Chromebookom</translation>
 <translation id="8528074251912154910">Dodaj jezike</translation>
 <translation id="8528962588711550376">Prijava.</translation>
 <translation id="8529026713753283969">Na taj ćete telefon primiti obavijest, zato ga imajte pri ruci.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index c10ffbd6..11fb919 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1783,7 +1783,6 @@
 <translation id="3688507211863392146">Az alkalmazásban megnyitott fájlok és mappák írása</translation>
 <translation id="3688526734140524629">Csatornaváltás</translation>
 <translation id="3688578402379768763">Naprakész</translation>
-<translation id="3691214267321877444">A Google Pay szolgáltatásban használt fizetési módok és címek.</translation>
 <translation id="3691231116639905343">Billentyűzetalkalmazások</translation>
 <translation id="3691267899302886494">A(z) <ph name="HOST" /> szeretné megosztani a képernyőt</translation>
 <translation id="3693415264595406141">Jelszó:</translation>
@@ -1855,7 +1854,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Alkalmazások gyorsparancs megjelenítése</translation>
 <translation id="3785727820640310185">A webhelyhez mentett jelszavak</translation>
-<translation id="3785852283863272759">Az oldal küldése e-mailben</translation>
 <translation id="3786301125658655746">Ön jelenleg offline állapotban van</translation>
 <translation id="3788401245189148511">A következőkre lehet képes:</translation>
 <translation id="3789841737615482174">Telepítés</translation>
@@ -4616,6 +4614,7 @@
 <translation id="8028993641010258682">Méret</translation>
 <translation id="8030656706657716245">Nyomtató hozzáadása</translation>
 <translation id="8032244173881942855">Nem lehet átküldeni a lapot.</translation>
+<translation id="8033827949643255796">kijelölve</translation>
 <translation id="8033958968890501070">Időtúllépés</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Összes megnyitása &amp;inkognitóablakban}=1{Megnyitás &amp;inkognitóablakban}other{Összes (#) megnyitása &amp;inkognitóablakban}}</translation>
 <translation id="8037117027592400564">Az összes szöveg felolvasása szintetizált beszéddel kimondva</translation>
@@ -4908,7 +4907,6 @@
 <translation id="8523493869875972733">Módosítások megtartása</translation>
 <translation id="8523849605371521713">Házirend adta hozzá</translation>
 <translation id="8525306231823319788">Teljes képernyő</translation>
-<translation id="8525982673980740788">Új funkciókat adhat hozzá, amelyek a telefon és a Chromebook kapcsolatát használják</translation>
 <translation id="8528074251912154910">Nyelvek hozzáadása</translation>
 <translation id="8528962588711550376">Bejelentkezés.</translation>
 <translation id="8529026713753283969">Értesítést kap erre a telefonra, ezért tartsa a közelében.</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index ebd655f4..9caa69e 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Menulis ke file dan folder yang Anda buka di aplikasi</translation>
 <translation id="3688526734140524629">Ubah saluran</translation>
 <translation id="3688578402379768763">Terbaru</translation>
-<translation id="3691214267321877444">Metode pembayaran dan alamat yang menggunakan Google Pay.</translation>
 <translation id="3691231116639905343">Aplikasi keyboard</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ingin berbagi layar Anda</translation>
 <translation id="3693415264595406141">Sandi:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Tampilkan Pintasan Aplikasi</translation>
 <translation id="3785727820640310185">Sandi yang tersimpan untuk situs ini</translation>
-<translation id="3785852283863272759">Email Lokasi Halaman</translation>
 <translation id="3786301125658655746">Anda sedang offline</translation>
 <translation id="3788401245189148511">Aplikasi/ekstensi dapat:</translation>
 <translation id="3789841737615482174">Instal</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Dimuat dari:</translation>
 <translation id="7180611975245234373">Segarkan</translation>
 <translation id="7180865173735832675">Sesuaikan</translation>
+<translation id="7182359331070524176">Pilih album Google Foto</translation>
 <translation id="7186088072322679094">Tetap sematkan di Bilah Alat</translation>
 <translation id="7187428571767585875">Entri registry yang akan dihapus atau diubah:</translation>
 <translation id="7189234443051076392">Pastikan ruang di perangkat Anda mencukupi</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Ukuran</translation>
 <translation id="8030656706657716245">Tambahkan Printer</translation>
 <translation id="8032244173881942855">Tidak dapat mentransmisi tab.</translation>
+<translation id="8033827949643255796">dipilih</translation>
 <translation id="8033958968890501070">Waktu habis</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Buka semua di &amp;jendela samaran}=1{Buka di &amp;jendela samaran}other{Buka semua (#) di &amp;jendela samaran}}</translation>
 <translation id="8037117027592400564">Membaca semua teks yang diucapkan menggunakan ucapan yang disintesis</translation>
@@ -4906,7 +4906,6 @@
 <translation id="8523493869875972733">Simpan Perubahan</translation>
 <translation id="8523849605371521713">Ditambahkan sesuai kebijakan</translation>
 <translation id="8525306231823319788">Layar penuh</translation>
-<translation id="8525982673980740788">Tambahkan fitur baru yang menggunakan sambungan internet ponsel ke Chromebook</translation>
 <translation id="8528074251912154910">Tambahkan bahasa</translation>
 <translation id="8528962588711550376">Masuk.</translation>
 <translation id="8529026713753283969">Anda akan mendapatkan notifikasi di ponsel ini, jadi pastikan ponsel selalu di dekat Anda.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 7d699a7..cabec31 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1779,7 +1779,6 @@
 <translation id="3688507211863392146">Accedere in modalità di scrittura a file e cartelle aperte nell'applicazione</translation>
 <translation id="3688526734140524629">Cambia canale</translation>
 <translation id="3688578402379768763">Aggiornato</translation>
-<translation id="3691214267321877444">Metodi di pagamento e indirizzi che utilizzano Google Pay.</translation>
 <translation id="3691231116639905343">App per tastiera</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> vuole condividere il tuo schermo</translation>
 <translation id="3693415264595406141">Password:</translation>
@@ -1851,7 +1850,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Mostra scorciatoia app</translation>
 <translation id="3785727820640310185">Password salvate per questo sito</translation>
-<translation id="3785852283863272759">Invia percorso pagina tramite email</translation>
 <translation id="3786301125658655746">Sei offline</translation>
 <translation id="3788401245189148511">Potrebbe:</translation>
 <translation id="3789841737615482174">Installa</translation>
@@ -4608,6 +4606,7 @@
 <translation id="8028993641010258682">Dimensioni</translation>
 <translation id="8030656706657716245">Aggiungi stampante</translation>
 <translation id="8032244173881942855">Impossibile trasmettere la scheda.</translation>
+<translation id="8033827949643255796">selezionati</translation>
 <translation id="8033958968890501070">Timeout</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Apri tutti in finestra di navigazione in &amp;incognito}=1{Apri in finestra di navigazione in &amp;incognito}other{Apri tutti (#) in finestra di navigazione in &amp;incognito}}</translation>
 <translation id="8037117027592400564">Lettura di tutto il testo pronunciato utilizzando la sintesi vocale</translation>
@@ -4900,7 +4899,6 @@
 <translation id="8523493869875972733">Mantieni le modifiche</translation>
 <translation id="8523849605371521713">Aggiunta in base alle norme</translation>
 <translation id="8525306231823319788">Schermo intero</translation>
-<translation id="8525982673980740788">Aggiungi nuove funzionalità che usano la connessione del telefono per il Chromebook</translation>
 <translation id="8528074251912154910">Aggiungi lingue</translation>
 <translation id="8528962588711550376">Accesso in corso.</translation>
 <translation id="8529026713753283969">Riceverai una notifica su questo telefono, pertanto tienilo vicino.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index b4f3a4e..0988864 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1779,7 +1779,6 @@
 <translation id="3688507211863392146">כתיבה לקבצים ותיקיות שאתה פותח ביישום</translation>
 <translation id="3688526734140524629">שנה ערוץ</translation>
 <translation id="3688578402379768763">מעודכן</translation>
-<translation id="3691214267321877444">‏אמצעי תשלום וכתובות שנשמרו ב-Google Pay.</translation>
 <translation id="3691231116639905343">אפליקציות מקלדת</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> רוצה לשתף את המסך שלך</translation>
 <translation id="3693415264595406141">סיסמה:</translation>
@@ -1851,7 +1850,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">הצג קיצור דרך אל יישומים</translation>
 <translation id="3785727820640310185">סיסמאות שמורות לאתר הזה</translation>
-<translation id="3785852283863272759">מיקום דף אימייל</translation>
 <translation id="3786301125658655746">אינך מחובר לאינטרנט</translation>
 <translation id="3788401245189148511">מעוניינים:</translation>
 <translation id="3789841737615482174">התקן</translation>
@@ -4609,6 +4607,7 @@
 <translation id="8028993641010258682">גודל</translation>
 <translation id="8030656706657716245">הוסף מדפסת</translation>
 <translation id="8032244173881942855">לא ניתן להעביר את הכרטיסייה.</translation>
+<translation id="8033827949643255796">מסומן</translation>
 <translation id="8033958968890501070">הזמן שהוקצב תם</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{פתח הכל בחלון &amp;גלישה בסתר}=1{פתח בחלון &amp;גלישה בסתר}two{פתח הכל (2) בחלון &amp;גלישה בסתר}many{פתח הכל (#) בחלון &amp;גלישה בסתר}other{פתח הכל (#) בחלון &amp;גלישה בסתר}}</translation>
 <translation id="8037117027592400564">קריאת כל הטקסט הנאמר באמצעות דיבור מסונתז</translation>
@@ -4901,7 +4900,6 @@
 <translation id="8523493869875972733">שמור את השינויים</translation>
 <translation id="8523849605371521713">נוסף על-ידי מדיניות</translation>
 <translation id="8525306231823319788">מסך מלא</translation>
-<translation id="8525982673980740788">‏הוספה של תכונות חדשות שמשתמשות בחיבור הטלפון אל ה-Chromebook</translation>
 <translation id="8528074251912154910">הוסף שפות</translation>
 <translation id="8528962588711550376">מבצע כניסה.</translation>
 <translation id="8529026713753283969">הודעה תישלח לטלפון הזה, לכן עליך לשמור אותו בקרבת מקום.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 00748503..1227a96 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">アプリケーションで開いたファイルとフォルダに書き込む</translation>
 <translation id="3688526734140524629">チャンネルを変更</translation>
 <translation id="3688578402379768763">最新</translation>
-<translation id="3691214267321877444">Google Pay のお支払い方法と住所。</translation>
 <translation id="3691231116639905343">キーボード アプリ</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> から、画面の共有許可を求められています</translation>
 <translation id="3693415264595406141">パスワード:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">アプリのショートカットを表示</translation>
 <translation id="3785727820640310185">このサイト用に保存されているパスワード</translation>
-<translation id="3785852283863272759">ページの場所をメールで送信</translation>
 <translation id="3786301125658655746">現在オフラインです</translation>
 <translation id="3788401245189148511">次の権限へのアクセス要求:</translation>
 <translation id="3789841737615482174">インストール</translation>
@@ -4615,6 +4613,7 @@
 <translation id="8028993641010258682">サイズ</translation>
 <translation id="8030656706657716245">プリンタを追加</translation>
 <translation id="8032244173881942855">タブをキャストできません。</translation>
+<translation id="8033827949643255796">選択しました</translation>
 <translation id="8033958968890501070">タイムアウト</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{すべてをシークレット ウィンドウで開く(&amp;I)}=1{シークレット ウィンドウで開く(&amp;I)}other{すべて(# 件)をシークレット ウィンドウで開く(&amp;I)}}</translation>
 <translation id="8037117027592400564">合成音声で読み上げたすべてのテキストの読み取り</translation>
@@ -4907,7 +4906,6 @@
 <translation id="8523493869875972733">変更を保持</translation>
 <translation id="8523849605371521713">ポリシーにより追加</translation>
 <translation id="8525306231823319788">全画面表示</translation>
-<translation id="8525982673980740788">スマートフォンと Chromebook の接続を使用する新しい機能を追加します</translation>
 <translation id="8528074251912154910">言語を追加</translation>
 <translation id="8528962588711550376">ログインしています。</translation>
 <translation id="8529026713753283969">このスマートフォンに通知が送信されます。スマートフォンを近くに置いておいてください。</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 758df8a..70561fa 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1779,7 +1779,6 @@
 <translation id="3688507211863392146">ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ನೀವು ತೆರೆಯುವಂತಹ ಫೈಲ್‌ಗಳು ಮತ್ತು ಫೋಲ್ಡರ್‌ಗಳಲ್ಲಿ ಬರೆಯಿರಿ</translation>
 <translation id="3688526734140524629">ಚಾನಲ್ ಬದಲಿಸಿ</translation>
 <translation id="3688578402379768763">ನವೀಕೃತವಾಗಿದೆ</translation>
-<translation id="3691214267321877444">Google Pay ಅನ್ನು ಬಳಸಿಕೊಂಡು ಮಾಡುವ ಪಾವತಿ ವಿಧಾನಗಳು ಮತ್ತು ವಿಳಾಸಗಳು.</translation>
 <translation id="3691231116639905343">ಕೀಬೋರ್ಡ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="3693415264595406141">ಪಾಸ್‌ವರ್ಡ್:</translation>
@@ -1851,7 +1850,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಶಾರ್ಟ್‌ಕಟ್ ತೋರಿಸು</translation>
 <translation id="3785727820640310185">ಈ ಸೈಟ್‌ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ</translation>
-<translation id="3785852283863272759">ಇಮೇಲ್ ಪುಟ ಸ್ಥಳ</translation>
 <translation id="3786301125658655746">ನೀವು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿರುವಿರಿ</translation>
 <translation id="3788401245189148511">ಇದು ಸಾಧ್ಯವಾಗಬಹುದು:</translation>
 <translation id="3789841737615482174">ಸ್ಥಾಪಿಸು</translation>
@@ -4602,6 +4600,7 @@
 <translation id="8028993641010258682">ಗಾತ್ರ</translation>
 <translation id="8030656706657716245">ಪ್ರಿಂಟರ್ ಸೇರಿಸಿ</translation>
 <translation id="8032244173881942855">ಟ್ಯಾಬ್‌‌ಗೆ ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
+<translation id="8033827949643255796">ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="8033958968890501070">ಅವಧಿ ಮೀರಿದೆ</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{&amp;ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ಎಲ್ಲವನ್ನು ತೆರೆಯಿರಿ}=1{&amp;ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ}one{&amp;ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ಎಲ್ಲಾ (#) ಅನ್ನು ತೆರೆಯಿರಿ}other{&amp;ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ಎಲ್ಲಾ (#) ಅನ್ನು ತೆರೆಯಿರಿ}}</translation>
 <translation id="8037117027592400564">ಸಂಯೋಜನೆ ಗೊಳಿಸಿದ ಧ್ವನಿಯನ್ನು ಬಳಸಿಕೊಂಡು ಮಾತನಾಡುವ ಎಲ್ಲಾ ಪಠ್ಯವನ್ನು ಓದಿ</translation>
@@ -4897,7 +4896,6 @@
 <translation id="8523493869875972733">ಬದಲಾವಣೆಗಳನ್ನು ಇರಿಸು</translation>
 <translation id="8523849605371521713">ಕಾರ್ಯನೀತಿಯಿಂದ ಸೇರಿಸಲಾಗಿದೆ</translation>
 <translation id="8525306231823319788">ಪೂರ್ಣ ಪರದೆ</translation>
-<translation id="8525982673980740788">ನಿಮ್ಮ ಫೋನ್‌ನ ಸಂಪರ್ಕವನ್ನು ನಿಮ್ಮ Chromebook ನೊಂದಿಗೆ ಬಳಸುವ ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="8528074251912154910">ಭಾಷೆಗಳನ್ನು ಸೇರಿಸು</translation>
 <translation id="8528962588711550376">ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="8529026713753283969">ಈ ಫೋನ್‌ನಲ್ಲಿ ನೀವು ಅಧಿಸೂಚನೆ ಪಡೆಯುತ್ತೀರಿ, ಆದ್ದರಿಂದ ಫೋನ್‌ ಅನ್ನು ಸಮೀಪದಲ್ಲಿ ಇರಿಸಿಕೊಳ್ಳಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 2188e4c..a4212c4 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">애플리케이션에서 연 파일 및 폴더에 쓰기</translation>
 <translation id="3688526734140524629">채널 변경</translation>
 <translation id="3688578402379768763">최신</translation>
-<translation id="3691214267321877444">Google Pay에 사용되는 결제 수단 및 주소</translation>
 <translation id="3691231116639905343">키보드 앱</translation>
 <translation id="3691267899302886494"><ph name="HOST" />에서 화면을 공유하려고 합니다</translation>
 <translation id="3693415264595406141">비밀번호:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">앱 단축키 표시</translation>
 <translation id="3785727820640310185">이 사이트의 저장된 비밀번호</translation>
-<translation id="3785852283863272759">이메일 페이지 위치</translation>
 <translation id="3786301125658655746">오프라인 상태입니다.</translation>
 <translation id="3788401245189148511">이전에 가능했던 대상:</translation>
 <translation id="3789841737615482174">설치</translation>
@@ -4612,6 +4610,7 @@
 <translation id="8028993641010258682">크기</translation>
 <translation id="8030656706657716245">프린터 추가</translation>
 <translation id="8032244173881942855">탭을 전송할 수 없습니다.</translation>
+<translation id="8033827949643255796">선택됨</translation>
 <translation id="8033958968890501070">시간 초과</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{시크릿 창에서 모두 열기(I)}=1{시크릿 창에서 열기(I)}other{시크릿 창에서 #개 모두 열기(I)}}</translation>
 <translation id="8037117027592400564">음성 출력 기능을 사용한 모든 음성 텍스트 조회</translation>
@@ -4904,7 +4903,6 @@
 <translation id="8523493869875972733">변경사항 유지</translation>
 <translation id="8523849605371521713">정책에 의해 추가</translation>
 <translation id="8525306231823319788">전체화면</translation>
-<translation id="8525982673980740788">Chromebook과 휴대전화 연결을 활용하는 새로운 기능을 추가하세요.</translation>
 <translation id="8528074251912154910">언어 추가</translation>
 <translation id="8528962588711550376">로그인 중입니다.</translation>
 <translation id="8529026713753283969">이 휴대전화에서 알림을 받게 되므로 휴대전화를 근처에 두세요.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index cf26eca..1b113b1 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Rašyti failuose ir aplankuose, kuriuos atidarėte programoje</translation>
 <translation id="3688526734140524629">Keisti kanalą</translation>
 <translation id="3688578402379768763">Atnaujinta</translation>
-<translation id="3691214267321877444">„Google Pay“ naudojami mokėjimo metodai ir adresai.</translation>
 <translation id="3691231116639905343">Klaviatūros programos</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> nori bendrinti ekrano vaizdą</translation>
 <translation id="3693415264595406141">Slaptažodis:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Rodyti spartųjį programų klavišą</translation>
 <translation id="3785727820640310185">Išsaugoti šios svetainės slaptažodžiai</translation>
-<translation id="3785852283863272759">El. pašto puslapio vieta</translation>
 <translation id="3786301125658655746">Esate neprisijungę</translation>
 <translation id="3788401245189148511">Prašoma leidimo:</translation>
 <translation id="3789841737615482174">Įdiegti</translation>
@@ -4615,6 +4613,7 @@
 <translation id="8028993641010258682">Dydis</translation>
 <translation id="8030656706657716245">Pridėti spausdintuvą</translation>
 <translation id="8032244173881942855">Nepavyko perduoti skirtuko.</translation>
+<translation id="8033827949643255796">pasirinkta</translation>
 <translation id="8033958968890501070">Skirtojo laiko pabaiga</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Atidaryti viską &amp;inkognito lange}=1{Atidaryti &amp;inkognito lange}one{Atidaryti viską (#) &amp;inkognito lange}few{Atidaryti viską (#) &amp;inkognito lange}many{Atidaryti viską (#) &amp;inkognito lange}other{Atidaryti viską (#) &amp;inkognito lange}}</translation>
 <translation id="8037117027592400564">Skaityti visą tekstą sintezuota kalba</translation>
@@ -4907,7 +4906,6 @@
 <translation id="8523493869875972733">Palikti pakeitimus</translation>
 <translation id="8523849605371521713">Pridėta pagal politiką</translation>
 <translation id="8525306231823319788">Viso ekrano režimas</translation>
-<translation id="8525982673980740788">Pridėkite naujų funkcijų, naudojančių telefono ryšį su „Chromebook“</translation>
 <translation id="8528074251912154910">Pridėti kalbų</translation>
 <translation id="8528962588711550376">Prisijungiama.</translation>
 <translation id="8529026713753283969">Gausite pranešimą į šį telefoną, todėl turėkite telefoną netoliese.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 020ff684..5b4fd1dd 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Rakstīt failos un mapēs, kurus atverat lietojumprogrammā</translation>
 <translation id="3688526734140524629">Mainīt kanālu</translation>
 <translation id="3688578402379768763">Atjaunināts</translation>
-<translation id="3691214267321877444">Adreses un maksājumu veidi, kuros tiek izmantots pakalpojums Google Pay</translation>
 <translation id="3691231116639905343">Tastatūras lietotnes</translation>
 <translation id="3691267899302886494">Vietnē <ph name="HOST" /> tiek pieprasīta atļauja kopīgot jūsu ekrānu.</translation>
 <translation id="3693415264595406141">Parole:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Rādīt lietotņu saīsnes</translation>
 <translation id="3785727820640310185">Saglabātās paroles šai vietnei</translation>
-<translation id="3785852283863272759">Nosūtīt lapas atrašanās vietu pa e-pastu</translation>
 <translation id="3786301125658655746">Esat bezsaistē</translation>
 <translation id="3788401245189148511">Varētu:</translation>
 <translation id="3789841737615482174">Instalēt</translation>
@@ -4613,6 +4611,7 @@
 <translation id="8028993641010258682">Izmērs</translation>
 <translation id="8030656706657716245">Pievienot printeri</translation>
 <translation id="8032244173881942855">Nevar apraidīt cilni.</translation>
+<translation id="8033827949643255796">atlasīti</translation>
 <translation id="8033958968890501070">Noildze</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Atvērt visas inkognito režīma logā}=1{Atvērt inkognito režīma logā}zero{Atvērt visas (#) inkognito režīma logā}one{Atvērt visas (#) inkognito režīma logā}other{Atvērt visas (#) inkognito režīma logā}}</translation>
 <translation id="8037117027592400564">Lasīt visu tekstu, kas izrunāts, izmantojot sintezēto runu</translation>
@@ -4906,7 +4905,6 @@
 <translation id="8523493869875972733">Saglabāt izmaiņas</translation>
 <translation id="8523849605371521713">Pievienots, jo iestatīts politikā</translation>
 <translation id="8525306231823319788">Pilnekrāna režīms</translation>
-<translation id="8525982673980740788">Pievienojiet jaunas funkcijas, kurās tiek izmantots jūsu tālruņa savienojums ar Chromebook datoru.</translation>
 <translation id="8528074251912154910">Pievienot valodas</translation>
 <translation id="8528962588711550376">Pierakstīšanās.</translation>
 <translation id="8529026713753283969">Jūs saņemsiet paziņojumu šajā tālrunī, tādēļ turiet to rokas stiepiena attālumā.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index b1d467d..f6595f4 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1779,7 +1779,6 @@
 <translation id="3688507211863392146">അപ്ലിക്കേഷനിൽ നിങ്ങൾ തുറക്കുന്ന ഫയലുകളിലും ഫോൾഡറുകളിലും റൈറ്റുചെയ്യുക.</translation>
 <translation id="3688526734140524629">ചാനൽ മാറ്റുക</translation>
 <translation id="3688578402379768763">അപ്‌ടുഡാറ്റാണ്</translation>
-<translation id="3691214267321877444">Google Pay ഉപയോഗിക്കുന്ന വിലാസങ്ങളും പേയ്മെന്റ് രീതികളും.</translation>
 <translation id="3691231116639905343">കീബോഡ് ആപ്പുകൾ</translation>
 <translation id="3691267899302886494">നിങ്ങളുടെ സ്‌ക്രീൻ പങ്കിടാൻ <ph name="HOST" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="3693415264595406141">പാസ്‌വേഡ്:</translation>
@@ -1851,7 +1850,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">അപ്ലിക്കേഷനുകളുടെ കുറുക്കുവഴി കാണിക്കുക</translation>
 <translation id="3785727820640310185">ഈ സൈറ്റിനായി സംരക്ഷിച്ച പാസ്‌വേഡുകൾ</translation>
-<translation id="3785852283863272759">പേജ് സ്ഥാനം ഇമെയില്‍‌ ചെയ്യുക</translation>
 <translation id="3786301125658655746">നിങ്ങൾ ഓഫ്‌ലൈനിലാണ്</translation>
 <translation id="3788401245189148511">ഇത് ആക്‌സ്സുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നത്:</translation>
 <translation id="3789841737615482174">ഇന്‍സ്റ്റാളുചെയ്യുക</translation>
@@ -4612,6 +4610,7 @@
 <translation id="8028993641010258682">വലുപ്പം</translation>
 <translation id="8030656706657716245">പ്രിന്ററുകൾ ചേർക്കുക</translation>
 <translation id="8032244173881942855">ടാബ് കാസ്‌റ്റുചെയ്യാനാവുന്നില്ല.</translation>
+<translation id="8033827949643255796">തിരഞ്ഞെടുത്തു</translation>
 <translation id="8033958968890501070">കാലഹരണപ്പെട്ടു</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{എല്ലാം &amp;അദൃശ്യ വിൻഡോയിൽ തുറക്കുക}=1{&amp;അദൃശ്യ വിൻഡോയിൽ തുറക്കുക}other{എല്ലാം (#) &amp;അദൃശ്യ വിൻഡോയിൽ തുറക്കുക}}</translation>
 <translation id="8037117027592400564">സംശ്ലേഷിച്ച സംഭാഷണം ഉപയോഗിക്കുന്ന എല്ലാ ടെക്സ്റ്റ് സംഭാഷണവും റീഡുചെയ്യുക</translation>
@@ -4904,7 +4903,6 @@
 <translation id="8523493869875972733">മാറ്റങ്ങൾ നിലനിർത്തുക</translation>
 <translation id="8523849605371521713">നയം ചേർത്തത്</translation>
 <translation id="8525306231823319788">പൂര്‍ണ്ണ സ്ക്രീന്‍</translation>
-<translation id="8525982673980740788">നിങ്ങളുടെ Chromebook-ലേക്ക് ഫോണിന്റെ കണക്ഷൻ ഉപയോഗിക്കുന്ന പുതിയ ഫീച്ചറുകൾ ചേർക്കുക</translation>
 <translation id="8528074251912154910">ഭാഷകൾ ചേർക്കുക</translation>
 <translation id="8528962588711550376">പ്രവേശിക്കുന്നു.</translation>
 <translation id="8529026713753283969">നിങ്ങൾക്ക് ഒരു അറിയിപ്പ് ലഭിക്കുന്നതിനാൽ ഫോൺ സമീപത്ത് തന്നെ വെയ്‌ക്കുക.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 7d7013fc..325fd77 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">आपण अनुप्रयोगामध्ये उघडता त्या फायलींमध्ये आणि फोल्डरमध्ये लिहा</translation>
 <translation id="3688526734140524629">चॅनेल बदला</translation>
 <translation id="3688578402379768763">अद्ययावत</translation>
-<translation id="3691214267321877444">Google Pay वापरून पेमेंट पद्धती आणि पत्ते.</translation>
 <translation id="3691231116639905343">कीबोर्ड अॅप्स</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ला तुमची स्क्रीन शेअर करायची आहे</translation>
 <translation id="3693415264595406141">पासवर्ड:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">अ‍ॅप्स शॉर्टकट दर्शवा</translation>
 <translation id="3785727820640310185">या साइटसाठी सेव्ह केलेले पासवर्ड</translation>
-<translation id="3785852283863272759">ईमेल पृष्ठ स्थान</translation>
 <translation id="3786301125658655746">आपण ऑफलाइन आहात</translation>
 <translation id="3788401245189148511">ते करू शकले असते:</translation>
 <translation id="3789841737615482174">स्थापना करा</translation>
@@ -4041,6 +4039,7 @@
 <translation id="7175353351958621980">येथून लोड केले:</translation>
 <translation id="7180611975245234373">रिफ्रेश करा</translation>
 <translation id="7180865173735832675">सानुकूल करा</translation>
+<translation id="7182359331070524176">Google फोटो अल्बम निवडा</translation>
 <translation id="7186088072322679094">टूलबारमध्ये ठेवा</translation>
 <translation id="7187428571767585875">काढून टाकण्‍यासाठी किंवा बदलण्‍यासाठी रजिस्‍ट्री प्रविष्ट्या:</translation>
 <translation id="7189234443051076392">तुमच्या डिव्हाइसवर पुरेशी जागा असल्याची खात्री करा</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">आकार</translation>
 <translation id="8030656706657716245">प्रिंटर जोडा</translation>
 <translation id="8032244173881942855">टॅब कास्ट करण्यात अक्षम.</translation>
+<translation id="8033827949643255796">निवडलेले</translation>
 <translation id="8033958968890501070">वेळ संपली</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{सर्व गुप्त विंडोमध्ये उघडा}=1{सर्व गुप्त विंडोमध्ये उघडा}one{सर्व (#) गुप्त विंडोमध्ये उघडा}other{सर्व (#) गुप्त विंडोमध्ये उघडा}}</translation>
 <translation id="8037117027592400564">संकालित भाषण वापरून बोललेला सर्व मजकूर वाचा</translation>
@@ -4906,7 +4906,6 @@
 <translation id="8523493869875972733">बदल राहू द्या</translation>
 <translation id="8523849605371521713">धोरणाने जोडले</translation>
 <translation id="8525306231823319788">पूर्ण स्क्रीन</translation>
-<translation id="8525982673980740788">तुमच्या Chromebook वर तुमच्या फोनचे कनेक्शन वापरणारी नवीन वैशिष्ट्ये जोडा</translation>
 <translation id="8528074251912154910">भाषा जोडा</translation>
 <translation id="8528962588711550376">साइन इन करत आहे.</translation>
 <translation id="8529026713753283969">तुम्हाला या फोनवर सूचना मिळेल त्यामुळे फोन जवळपास ठेवा.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 4dd0a58..28932ec0 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1783,7 +1783,6 @@
 <translation id="3688507211863392146">Tulis pada fail dan folder yang anda buka dalam aplikasi</translation>
 <translation id="3688526734140524629">Tukar saluran</translation>
 <translation id="3688578402379768763">Terkini</translation>
-<translation id="3691214267321877444">Kaedah pembayaran dan alamat yang menggunakan Google Pay.</translation>
 <translation id="3691231116639905343">Apl papan kekunci</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ingin berkongsi skrin anda</translation>
 <translation id="3693415264595406141">Kata laluan:</translation>
@@ -1855,7 +1854,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Paparkan Pintasan Apl</translation>
 <translation id="3785727820640310185">Kata laluan disimpan untuk tapak ini</translation>
-<translation id="3785852283863272759">Email Page Location</translation>
 <translation id="3786301125658655746">Anda di luar talian</translation>
 <translation id="3788401245189148511">Item boleh:</translation>
 <translation id="3789841737615482174">Pasang</translation>
@@ -4040,6 +4038,7 @@
 <translation id="7175353351958621980">Dimuatkan daripada:</translation>
 <translation id="7180611975245234373">Muat semula</translation>
 <translation id="7180865173735832675">Peribadikan</translation>
+<translation id="7182359331070524176">Pilih album Google Photos</translation>
 <translation id="7186088072322679094">Simpan dalam Bar Alat</translation>
 <translation id="7187428571767585875">Masukan daftaran yang hendak dialih keluar atau diubah:</translation>
 <translation id="7189234443051076392">Pastikan ruang pada peranti anda mencukupi</translation>
@@ -4615,6 +4614,7 @@
 <translation id="8028993641010258682">Saiz</translation>
 <translation id="8030656706657716245">Tambah Pencetak</translation>
 <translation id="8032244173881942855">Tidak dapat menghantar tab.</translation>
+<translation id="8033827949643255796">dipilih</translation>
 <translation id="8033958968890501070">Tamat masa</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Buka semua dalam tetingkap &amp;inkognito}=1{Buka dalam tetingkap &amp;inkognito}other{Buka semua (#) dalam tetingkap &amp;inkognito}}</translation>
 <translation id="8037117027592400564">Baca semua teks yang dituturkan menggunakan pertuturan disintesiskan</translation>
@@ -4908,7 +4908,6 @@
 <translation id="8523493869875972733">Simpan Perubahan</translation>
 <translation id="8523849605371521713">Ditambahkan oleh dasar</translation>
 <translation id="8525306231823319788">Skrin penuh</translation>
-<translation id="8525982673980740788">Tambah ciri baharu yang menggunakan sambungan telefon anda ke Chromebook anda</translation>
 <translation id="8528074251912154910">Tambah bahasa</translation>
 <translation id="8528962588711550376">Melog masuk.</translation>
 <translation id="8529026713753283969">Anda akan mendapat pemberitahuan pada telefon ini, oleh itu, pastikan telefon berada berdekatan.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index ff95cb10..bfc1bd0 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Schrijven naar bestanden en mappen die je opent in de app</translation>
 <translation id="3688526734140524629">Kanaal wijzigen</translation>
 <translation id="3688578402379768763">Bijgewerkt</translation>
-<translation id="3691214267321877444">Betaalmethoden en adressen die Google Pay gebruiken.</translation>
 <translation id="3691231116639905343">Toetsenbord-apps</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> wil je scherm delen</translation>
 <translation id="3693415264595406141">Wachtwoord:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Snelle link voor apps weergeven</translation>
 <translation id="3785727820640310185">Opgeslagen wachtwoorden voor deze site</translation>
-<translation id="3785852283863272759">Verstuur paginalocatie</translation>
 <translation id="3786301125658655746">Je bent offline</translation>
 <translation id="3788401245189148511">De apps/extensies zouden nu het volgende kunnen doen:</translation>
 <translation id="3789841737615482174">Installeren</translation>
@@ -4040,6 +4038,7 @@
 <translation id="7175353351958621980">Geladen via:</translation>
 <translation id="7180611975245234373">Vernieuwen</translation>
 <translation id="7180865173735832675">Aanpassen</translation>
+<translation id="7182359331070524176">Een Google Foto's-album selecteren</translation>
 <translation id="7186088072322679094">In werkbalk houden</translation>
 <translation id="7187428571767585875">Registervermeldingen die moeten worden verwijderd of gewijzigd:</translation>
 <translation id="7189234443051076392">Zorg dat er voldoende ruimte op je apparaat beschikbaar is</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Grootte</translation>
 <translation id="8030656706657716245">Printer toevoegen</translation>
 <translation id="8032244173881942855">Kan tabblad niet casten.</translation>
+<translation id="8033827949643255796">geselecteerd</translation>
 <translation id="8033958968890501070">Time-out</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Alles openen in &amp;incognitovenster}=1{Openen in &amp;incognitovenster}other{Alles (#) openen in &amp;incognitovenster}}</translation>
 <translation id="8037117027592400564">Alle tekst lezen die wordt gesproken met gesynthetiseerde spraak</translation>
@@ -4906,7 +4906,6 @@
 <translation id="8523493869875972733">Wijzigingen behouden</translation>
 <translation id="8523849605371521713">Toegevoegd door beleid</translation>
 <translation id="8525306231823319788">Volledig scherm</translation>
-<translation id="8525982673980740788">Nieuwe functies toevoegen die de verbinding van je telefoon met je Chromebook gebruiken</translation>
 <translation id="8528074251912154910">Talen toevoegen</translation>
 <translation id="8528962588711550376">Inloggen.</translation>
 <translation id="8529026713753283969">Je ontvangt een melding op de telefoon, dus zorg ervoor dat je deze bij de hand hebt.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index b9ff972b..9d4a8a6 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -222,6 +222,7 @@
 <translation id="1316136264406804862">Søker …</translation>
 <translation id="1316495628809031177">Synkroniseringen er satt på pause</translation>
 <translation id="1319979322914001937">En app som viser en filtrert liste over utvidelser fra Chrome Nettmarked. Utvidelser i listen kan installeres direkte fra appen.</translation>
+<translation id="1322046419516468189">Se og administrer lagrede passord i <ph name="SAVED_PASSWORDS_STORE" /> din</translation>
 <translation id="1326317727527857210">For å få fanene dine fra de andre enhetene du bruker, logg på Chrome.</translation>
 <translation id="1327074568633507428">Skriver på Google Cloud Print</translation>
 <translation id="1327977588028644528">Gateway</translation>
@@ -415,11 +416,13 @@
 <translation id="1618268899808219593">&amp;Brukerstøtte</translation>
 <translation id="162035744160882748">Slå på synkronisering, personlig tilpasning og andre Google-tjenester</translation>
 <translation id="1620510694547887537">Kamera</translation>
+<translation id="1623132449929929218">Bildene er ikke tilgjengelige nå. Koble til Internettet på nytt for å se bakgrunnsamlingene.</translation>
 <translation id="1624026626836496796">Dette skjer bare én gang. Påloggingsinformasjonen din lagres ikke.</translation>
 <translation id="1627276047960621195">Filbeskrivelser</translation>
 <translation id="1627408615528139100">Allerede lastet ned</translation>
 <translation id="1632803087685957583">Lar deg justere repetisjonshastigheten på tastaturet, ordforslag osv.</translation>
 <translation id="1635033183663317347">Installert av din foresatte.</translation>
+<translation id="1635885551358739414">Google kan bruke innhold på nettsteder du besøker, nettleseraktiviteten din og andre interaksjoner for å gi Chrome og andre Google-tjenester (som Oversetter, Søk og annonser) et personlig preg. Du kan tilpasse dette i innstillingene.</translation>
 <translation id="1637224376458524414">Få dette bokmerket på iPhone</translation>
 <translation id="1637765355341780467">Det oppsto en feil ved åpning av profilen din. Det kan hende at enkelte funksjoner ikke er tilgjengelige.</translation>
 <translation id="1639239467298939599">Laster inn</translation>
@@ -450,6 +453,7 @@
 <translation id="166179487779922818">Passordet er for kort.</translation>
 <translation id="1661867754829461514">Personlig kode mangler</translation>
 <translation id="16620462294541761">Beklager, passordet kan ikke verifiseres. Prøv på nytt.</translation>
+<translation id="1662550410081243962">Lagre og fyll ut betalingsmåter</translation>
 <translation id="166278006618318542">Algoritme for enhetens offentlige nøkkel</translation>
 <translation id="166439687370499867">Det er ikke tillatt å endre delte nettverkskonfigurasjoner</translation>
 <translation id="1665611772925418501">Kunne ikke endre filen.</translation>
@@ -459,6 +463,7 @@
 <translation id="1673137583248014546"><ph name="URL" /> ber om å se merket og modellen til sikkerhetsnøkkelen din</translation>
 <translation id="167832068858235403">redusert lydstyrke</translation>
 <translation id="1679068421605151609">Utviklerverktøy</translation>
+<translation id="1680849702532889074">Det oppstå en feil under installasjon av Linux-programmet ditt.</translation>
 <translation id="16815041330799488">Ikke la nettsteder se tekst og bilder som er kopiert til utklippstavlen</translation>
 <translation id="1682548588986054654">Nytt inkognitovindu</translation>
 <translation id="168715261339224929">For å få bokmerkene dine på alle enhetene dine, slå på synkronisering.</translation>
@@ -494,6 +499,7 @@
 <translation id="1732215134274276513">Løsne faner</translation>
 <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> oppdateres muligens ikke automatisk</translation>
 <translation id="1736419249208073774">Utforsk</translation>
+<translation id="1736827427463982819">Slå av Linux (Beta)</translation>
 <translation id="1737968601308870607">Rapporter feil</translation>
 <translation id="1741314857973421784">Fortsett</translation>
 <translation id="174173592514158117">Vis alle Play-mapper</translation>
@@ -666,6 +672,7 @@
 <translation id="1997484222658892567"><ph name="URL" /> ber om å lagre store mengder data permanent på datamaskinen din</translation>
 <translation id="1997616988432401742">Dine sertifikater</translation>
 <translation id="1999115740519098545">Ved oppstart</translation>
+<translation id="2000419248597011803">Sender noen informasjonskapsler og søk fra adressefeltet og søkefeltet samt noen informasjonskapsler til standardsøkemotoren din</translation>
 <translation id="2001796770603320721">Administrer i Disk</translation>
 <translation id="2004663115385769400">Kan ikke åpne med $1</translation>
 <translation id="200544492091181894">Du kan endre dette senere i innstillingene</translation>
@@ -692,6 +699,7 @@
 <translation id="2045969484888636535">Fortsett blokkering av informasjonskapsler</translation>
 <translation id="204622017488417136">Enheten blir tilbakestilt til den tidligere installerte versjonen av Chrome. Alle brukerkontoer og lokale data fjernes. Dette kan ikke gjøres om.</translation>
 <translation id="2048182445208425546">Få tilgang til nettverkstrafikken din</translation>
+<translation id="2048653237708779538">Handling ikke tilgjengelig</translation>
 <translation id="204914487372604757">Opprett snarvei</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2053312383184521053">Data om hviletilstand</translation>
@@ -780,6 +788,7 @@
 <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_NAME" /> på <ph name="PEPPER_PLUGIN_DOMAIN" /> ber om tilgang til datamaskinen din</translation>
 <translation id="2178614541317717477">Sertifiseringsinstans-kompromiss</translation>
 <translation id="218070003709087997">Bruk et tall for å angi hvor mange eksemplarer som skal skrives ut (1–999).</translation>
+<translation id="2183558561014688873">Få tilgang til assistenten din når som helst ved å si "Ok Google" når enheten er på og ulåst.</translation>
 <translation id="2187895286714876935">Feil ved import av tjenersertifikat</translation>
 <translation id="2187906491731510095">Utvidelser er oppdatert</translation>
 <translation id="2188881192257509750">Åpne <ph name="APPLICATION" /></translation>
@@ -851,6 +860,7 @@
 <translation id="2282146716419988068">GPU-prosess</translation>
 <translation id="2282155092769082568">Nettadresse for automatisk konfigurering:</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2283340219607151381">Lagre og fyll inn adresser</translation>
 <translation id="2286841657746966508">Faktureringsadresse</translation>
 <translation id="2288181517385084064">Bytt til videoopptaker</translation>
 <translation id="2288735659267887385">Innstillinger for tilgjengelighet</translation>
@@ -932,6 +942,7 @@
 <translation id="2425665904502185219">Total filstørrelse</translation>
 <translation id="2428510569851653187">Beskriv hva du holdt på med da fanen kræsjet</translation>
 <translation id="2431027948063157455">Google-assistenten kunne ikke lastes inn. Kontrollér nettverkstilkoblingen din, og prøv på nytt.</translation>
+<translation id="2432753757290432042">Linux (Beta) oppdatering kreves</translation>
 <translation id="2433452467737464329">Legg til en søkeparameter i nettadressen for å automatisk laste inn siden på nytt: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Utseende</translation>
 <translation id="2433836460518180625">Lås kun opp enheten</translation>
@@ -1180,6 +1191,7 @@
 <translation id="2775104091073479743">Endre fingeravtrykk</translation>
 <translation id="2776441542064982094">Det ser ut til at det ikke er noen enheter som kan registreres på nettverket. Hvis enheten din er slått på og koblet til Internett, kan du prøve å registrere den ved å følge instruksjonene i instruksjonshåndboken.</translation>
 <translation id="2781692009645368755">Google Pay</translation>
+<translation id="2782104745158847185">Feil ived installasjon av Linux-programmet</translation>
 <translation id="2783298271312924866">Lastet ned</translation>
 <translation id="2783321960289401138">Opprett snarvei</translation>
 <translation id="2783829359200813069">Velg krypteringstyper</translation>
@@ -1204,6 +1216,7 @@
 <translation id="2812944337881233323">Prøv å logge av og på igjen</translation>
 <translation id="2812989263793994277">Ikke vis bilder</translation>
 <translation id="2814489978934728345">Stopp innlasting av denne siden</translation>
+<translation id="281504910091592009">Se og administrer lagrede passord i <ph name="BEGIN_LINK" />Google-kontoen<ph name="END_LINK" /> din</translation>
 <translation id="2815500128677761940">Bokmerkerad</translation>
 <translation id="2815693974042551705">Bokmerke-mappen</translation>
 <translation id="2818476747334107629">Skriverdetaljer</translation>
@@ -1284,6 +1297,7 @@
 <translation id="2939938020978911855">Vis tilgjengelige Bluetooth-enheter</translation>
 <translation id="2941112035454246133">Lav</translation>
 <translation id="2942560570858569904">Venter …</translation>
+<translation id="2942581856830209953">Tilpass denne siden</translation>
 <translation id="2943400156390503548">Lysbilder</translation>
 <translation id="2943503720238418293">Bruk et kortere navn</translation>
 <translation id="2946119680249604491">Legg til forbindelse</translation>
@@ -1763,12 +1777,12 @@
 <translation id="3688507211863392146">skrive til filer og mapper du åpner i appen</translation>
 <translation id="3688526734140524629">Bytt kanal</translation>
 <translation id="3688578402379768763">Oppdatert</translation>
-<translation id="3691214267321877444">Betalingsmåter og adresser ved bruk av Google Pay.</translation>
 <translation id="3691231116639905343">Tastaturapper</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ber om å dele skjermen din</translation>
 <translation id="3693415264595406141">Passord:</translation>
 <translation id="3694027410380121301">Velg forrige fane</translation>
 <translation id="3699624789011381381">E-postadresse</translation>
+<translation id="3699920817649120894">Slå av synkronisering og personalisering?</translation>
 <translation id="3700888195348409686">Presenterer (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3702500414347826004">Oppstartssidene er endret til å inkludere <ph name="URL" />.</translation>
 <translation id="370415077757856453">JavaScript er blokkert</translation>
@@ -1834,7 +1848,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Vis appsnarveien</translation>
 <translation id="3785727820640310185">Lagrede passord for dette nettstedet</translation>
-<translation id="3785852283863272759">Send sideplassering som e-post</translation>
 <translation id="3786301125658655746">Du er ikke tilkoblet Internett</translation>
 <translation id="3788401245189148511">Den får følgende tilgang:</translation>
 <translation id="3789841737615482174">Installer</translation>
@@ -1866,6 +1879,7 @@
 <translation id="3827774300009121996">&amp;Full skjerm</translation>
 <translation id="3828029223314399057">Søk i bokmerker</translation>
 <translation id="3830674330436234648">Ingen avspillinger er tilgjengelige</translation>
+<translation id="3831436149286513437">Søkeforslag fra Google disk</translation>
 <translation id="3831486154586836914">Du er i modusen for vindusoversikt</translation>
 <translation id="383161972796689579">Eieren av denne enheten har deaktivert tillegging av nye brukere</translation>
 <translation id="3834775135533257713">Kunne ikke legge til appen «<ph name="TO_INSTALL_APP_NAME" />» fordi den er i konflikt med «<ph name="INSTALLED_APP_NAME" />».</translation>
@@ -1899,6 +1913,7 @@
 <translation id="3871092408932389764">Lavest</translation>
 <translation id="3872220884670338524">Flere handlinger, lagret konto for <ph name="USERNAME" /> på <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Frigjør lagringsplass for å unngå at enheten slutter å reagere.</translation>
+<translation id="3873315167136380065">For å skru dette på, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" /> for å fjerne din synkronisering av passordfrase</translation>
 <translation id="3878840326289104869">Oppretter en administrert bruker</translation>
 <translation id="3879748587602334249">Nedlastingsbehandling</translation>
 <translation id="3880709822663530586">Sikkerhetsnøkkelen din fungerer bare når enhetens Bluetooth er på</translation>
@@ -2020,6 +2035,7 @@
 <translation id="4068776064906523561">Lagrede fingeravtrykk</translation>
 <translation id="407173827865827707">Ved klikk</translation>
 <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: påloggingsfeil</translation>
+<translation id="4071828814509176232">Ok Google</translation>
 <translation id="4074900173531346617">Sertifikat for signering av e-poster</translation>
 <translation id="407520071244661467">Skalér</translation>
 <translation id="4075639477629295004">Kunne ikke caste <ph name="FILE_NAME" />.</translation>
@@ -2087,6 +2103,7 @@
 <translation id="4192273449750167573">Gjennomgå innstillingene dine på den neste skjermen</translation>
 <translation id="4193154014135846272">Google-dokument</translation>
 <translation id="4194570336751258953">Aktiver berøringsklikk</translation>
+<translation id="4195249722193633765">Installer app med Linux (Beta)</translation>
 <translation id="4195643157523330669">Åpne i ny fane</translation>
 <translation id="4195814663415092787">Fortsett der du slapp</translation>
 <translation id="4197674956721858839">Zip-utvalg</translation>
@@ -2147,7 +2164,9 @@
 <translation id="428608937826130504">Hylleelement 8</translation>
 <translation id="4287502004382794929">Du har ikke tilstrekkelige programvarelisenser for å registrere denne enheten. Ta kontakt med salgsavdelingen for å kjøpe flere. Hvis du tror dette er en feil, kan du ta kontakt med brukerstøtten.</translation>
 <translation id="4289540628985791613">Oversikt</translation>
+<translation id="4295072614469448764">Appen er tilgjengelig i terminalen din. Det kan også været et ikon i din appoversikt.</translation>
 <translation id="4296575653627536209">Legg til en administrert bruker</translation>
+<translation id="4297219207642690536">Start på nytt og tilbakestill</translation>
 <translation id="4297322094678649474">Endre språk</translation>
 <translation id="4300305918532693141">For å endre denne innstillingen, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" />.</translation>
 <translation id="4305227814872083840">lang (2 s)</translation>
@@ -2183,6 +2202,7 @@
 <translation id="4370975561335139969">E-posten og passordet du skrev inn, stemmer ikke overens.</translation>
 <translation id="437184764829821926">Avanserte innstillinger for skrifttype</translation>
 <translation id="4372884569765913867">1 x 1</translation>
+<translation id="4374831787438678295">Linux-installer</translation>
 <translation id="4375035964737468845">åpne nedlastede filer</translation>
 <translation id="4377363674125277448">Det oppsto et problem med sertifikatet til tjeneren.</translation>
 <translation id="4378154925671717803">Telefon</translation>
@@ -2301,6 +2321,7 @@
 <translation id="4576541033847873020">Koble til Bluetooth-enhet</translation>
 <translation id="4579581181964204535">Kunne ikke caste <ph name="HOST_NAME" />.</translation>
 <translation id="4580526846085481512">Er du sikker på at du vil slette $1 elementer?</translation>
+<translation id="4582497162516204941">Installer med Linux (Beta)</translation>
 <translation id="4582563038311694664">Tilbakestill alle innstillingene</translation>
 <translation id="4585793705637313973">Endre siden</translation>
 <translation id="4589268276914962177">Ny terminal</translation>
@@ -2544,6 +2565,7 @@
 <translation id="4953808748584563296">Oransje standardbrukerbilde</translation>
 <translation id="4955814292505481804">Årlig</translation>
 <translation id="4957949153200969297">Slår bare på funksjoner knyttet til <ph name="IDS_SHORT_PRODUCT_NAME" />-synkronisering</translation>
+<translation id="4959262764292427323">Passordene er lagret i Google-kontoen din, slik at du kan bruke dem på hvilken som helst enhet</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation>
 <translation id="496226124210045887">Mappen du valgte inneholder sensitive filer. Er du sikker på at du vil gi «$1» permanent lesetilgang til denne mappen?</translation>
 <translation id="4964455510556214366">Oppsett</translation>
@@ -2722,6 +2744,7 @@
 <translation id="5240817131241497236">Innstillingene som kontrollerer synkronisering, personlig tilpasning og andre Google-tjenester i Chrome, er blitt endret. Dette kan påvirke de nåværende innstillingene dine.</translation>
 <translation id="5241128660650683457">Les alle dataene på nettstedene du besøker</translation>
 <translation id="5242724311594467048">Vil du slå på «<ph name="EXTENSION_NAME" />»?</translation>
+<translation id="5243522832766285132">Prøv på nytt om en liten stund</translation>
 <translation id="5244474230056479698">Synkroniserer til <ph name="EMAIL" /></translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> har fått programstopp. Klikk på denne ballongen for å starten programmet på nytt.</translation>
 <translation id="5247051749037287028">Visningsnavn (valgfritt)</translation>
@@ -2744,6 +2767,7 @@
 <translation id="5264148714798105376">Dette kan ta omtrent ett minutt.</translation>
 <translation id="5264252276333215551">Koble til Internett for å starte appen din i kioskmodus.</translation>
 <translation id="5265562206369321422">Frakoblet i mer enn én uke</translation>
+<translation id="5265797726250773323">Feil under installering</translation>
 <translation id="5266113311903163739">Feil ved importering av sertifiseringsinstans</translation>
 <translation id="5269977353971873915">Utskrift mislyktes</translation>
 <translation id="5271549068863921519">Lagre passord</translation>
@@ -2766,6 +2790,7 @@
 <translation id="529175790091471945">Formatér denne enheten</translation>
 <translation id="5292195676005197571">For å bruke de fleste nøkler, bare trykk på knappen</translation>
 <translation id="5293170712604732402">Tilbakestill innstillingene til standardverdiene</translation>
+<translation id="5297082477358294722">Passordet er lagret. Se og administrer lagrede passord på <ph name="SAVED_PASSWORDS_STORE" /> din.</translation>
 <translation id="5298219193514155779">Tema opprettet av</translation>
 <translation id="5299109548848736476">Ingen sporing</translation>
 <translation id="5299682071747318445">Alle dataene er kryptert med passordfrasen din</translation>
@@ -2994,6 +3019,7 @@
 <translation id="5612720917913232150"><ph name="URL" /> ber om å bruke posisjonen til enheten din</translation>
 <translation id="5612734644261457353">Passordet ditt kunne fortsatt ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, blir det nye passordet ditt tatt i bruk når du logger deg av. Du må bruke det gamle passordet her.</translation>
 <translation id="5614190747811328134">Brukerinformasjon</translation>
+<translation id="5614553682702429503">Lagre passord?</translation>
 <translation id="561698261642843490">Lukk Firefox</translation>
 <translation id="5618075537869101857">Kiosk-appen kunne ikke kjøres.</translation>
 <translation id="5618333180342767515">(dette kan ta noen minutter)</translation>
@@ -3034,6 +3060,7 @@
 <translation id="5677503058916217575">Sidespråk:</translation>
 <translation id="5677928146339483299">Blokkert</translation>
 <translation id="5678550637669481956">Lese- og skrivetilgang til <ph name="VOLUME_NAME" /> er innvilget.</translation>
+<translation id="5678784840044122290">Linux-programmet vil være tilgjengelig i terminalen din, samt kan vise et ikon i din appoversikt.</translation>
 <translation id="5678955352098267522">Les dataene dine på <ph name="WEBSITE_1" /></translation>
 <translation id="5684661240348539843">Ressursidentifikator</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Kan ikke koble fra et arkiv eller en virtuell disk<ph name="END_BOLD" />
@@ -3129,6 +3156,7 @@
 <translation id="5832805196449965646">Legg til person</translation>
 <translation id="583281660410589416">Ukjent</translation>
 <translation id="5832976493438355584">Låst</translation>
+<translation id="5833397272224757657">Bruker innhold fra nettsteder du besøker, nettleseraktivitet og andre interaksjoner for å gi ting et personlig preg</translation>
 <translation id="5833610766403489739">Denne filen har vandret av gårde. Sjekk innstillingen din for nedlastingsplassering, og prøv på nytt.</translation>
 <translation id="5833726373896279253">Disse innstillingene kan bare modifiseres av eieren:</translation>
 <translation id="5834581999798853053">Omtrent <ph name="TIME" /> minutter igjen</translation>
@@ -3182,6 +3210,7 @@
 <translation id="5908769186679515905">Blokkér nettsteder fra å kjøre Flash</translation>
 <translation id="5910363049092958439">Lagre &amp;bildet som</translation>
 <translation id="5911737117543891828">Midlertidige Google Disk-filer utenfor Internett slettes. Filer du har satt som tilgjengelig utenfor Internett, blir ikke slettet fra denne enheten.</translation>
+<translation id="5911887972742538906">Det oppsto en feil under installasjon av ditt Linux-program.</translation>
 <translation id="5912378097832178659">R&amp;ediger søkemotorer...</translation>
 <translation id="5914724413750400082">Modulus (<ph name="MODULUS_NUM_BITS" /> biters):
   <ph name="MODULUS_HEX_DUMP" />
@@ -3368,6 +3397,7 @@
 <translation id="6198102561359457428">Logg deg av og på igjen</translation>
 <translation id="6198252989419008588">Endre personlig kode</translation>
 <translation id="6199801702437275229">Venter på informasjon om lagringsplass …</translation>
+<translation id="6201792273624501289">Linux-apper</translation>
 <translation id="6204015976622790023">Se relevante forslag fra assistenten tilknyttet det som er på skjermen.</translation>
 <translation id="6205710420833115353">Noen handlinger tar lengre tid enn vanlig. Vil du avbryte dem?</translation>
 <translation id="6206311232642889873">&amp;Kopier bilde</translation>
@@ -3843,6 +3873,7 @@
 <translation id="6945221475159498467">Velg</translation>
 <translation id="694592694773692225">Viderekobling er blokkert på denne siden.</translation>
 <translation id="6949306908218145636">Bokmerk åpne sider</translation>
+<translation id="6950627417367801484">Gjenopprett apper</translation>
 <translation id="6951153907720526401">Betalingsbehandlere</translation>
 <translation id="6955446738988643816">Undersøk forgrunnsvindu</translation>
 <translation id="6957231940976260713">Tjenestenavn</translation>
@@ -3968,6 +3999,7 @@
 <translation id="7127980134843952133">Nedlastingslogg</translation>
 <translation id="7131040479572660648">Lesing av dataene dine på <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">Legg til si&amp;de</translation>
+<translation id="7133578150266914903">Administratoren din kaller tilbake denne enheten (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="7134098520442464001">Forminsk teksten</translation>
 <translation id="7136694880210472378">Bruk som standard</translation>
 <translation id="7136984461011502314">Velkommen til <ph name="PRODUCT_NAME" /></translation>
@@ -4168,6 +4200,7 @@
 <translation id="7463006580194749499">Legg til person</translation>
 <translation id="7464490149090366184">Opprettelsen av zip-filen mislyktes – elementet eksisterer: «$1»</translation>
 <translation id="7465778193084373987">Nettadresse for tilbakekalling av Netscape-sertifikat</translation>
+<translation id="7469406957790636836">For å slå dette på, må du først slå på stavekontrollen i <ph name="BEGIN_LINK" />Språk og inndata<ph name="END_LINK" /></translation>
 <translation id="7469894403370665791">Koble til dette nettverket automatisk</translation>
 <translation id="747114903913869239">Feil: Kan ikke avkode etternavnet</translation>
 <translation id="7473753388963818366">La oss få deg i gang med <ph name="DEVICE_TYPE" /></translation>
@@ -4263,6 +4296,7 @@
 <translation id="7606992457248886637">Utstedere</translation>
 <translation id="7607002721634913082">Midlertidig stanset</translation>
 <translation id="7607274158153386860">Be om nettsted for nettbrett</translation>
+<translation id="7609148976235050828">Koble til Internett og prøv på nytt.</translation>
 <translation id="7611008212562900400">Søk på enheten, i apper, på nettet osv.</translation>
 <translation id="7616214729753637086">Registrerer enheten …</translation>
 <translation id="7617366389578322136">Kobler til «<ph name="DEVICE_NAME" />»</translation>
@@ -4331,6 +4365,7 @@
 <translation id="7730449930968088409">ta bilde av innhold på skjermen din</translation>
 <translation id="7730494089396812859">Vis detaljer for skybasert sikkerhetskopiering</translation>
 <translation id="7732111077498238432">Nettverket er kontrollert av regler</translation>
+<translation id="7737238973539693982">Slett Linux (Beta)</translation>
 <translation id="773905249182896430">Beskytter deg og enheten din mot farlige nettsteder</translation>
 <translation id="7740996059027112821">Standard</translation>
 <translation id="7748528009589593815">Forrige fane</translation>
@@ -4519,6 +4554,7 @@
 <translation id="7974936243149753750">Overskanning</translation>
 <translation id="7977551819349545646">Oppdaterer Chromebox …</translation>
 <translation id="7978412674231730200">Privatnøkkel</translation>
+<translation id="7978450511781612192">Dette logger deg av Google-kontoene dine. Dine bokmerker, histore, passord, med mer, vil ikke lengre bli synkronisert.</translation>
 <translation id="7979036127916589816">Feil ved synkronisering</translation>
 <translation id="7980084013673500153">Ressurs-ID: <ph name="ASSET_ID" /></translation>
 <translation id="7981313251711023384">Last inn sider på forhånd for raskere nettlesing og søk</translation>
@@ -4565,6 +4601,7 @@
 <translation id="8028993641010258682">Størrelse</translation>
 <translation id="8030656706657716245">Legg til skriver</translation>
 <translation id="8032244173881942855">Fanen kunne ikke castes.</translation>
+<translation id="8033827949643255796">valgt</translation>
 <translation id="8033958968890501070">Tidsavbrudd</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Åpne alle i &amp;inkognitovinduer}=1{Åpne i et &amp;inkognitovindu}other{Åpne alle (#) i &amp;inkognitovinduer}}</translation>
 <translation id="8037117027592400564">lese hele teksten med syntetisert tale</translation>
@@ -4683,6 +4720,7 @@
 <translation id="8226619461731305576">Kø</translation>
 <translation id="8226742006292257240">Nedenfor ser du et tilfeldig generert TPM-passord som er tildelt datamaskinen din:</translation>
 <translation id="8227119283605456246">Legg ved fil</translation>
+<translation id="8230134520748321204">Lagre passord for <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Hjelp programutviklerne våre med å løse dette problemet. Fortell oss hva som skjedde rett før du fikk profilfeilmeldingen:</translation>
 <translation id="8234989666557591529">Velg hvilken telefon du vil låse opp <ph name="DEVICE_TYPE" />-enheten med</translation>
 <translation id="8239020549147958415">Synkroniser som <ph name="FULL_NAME" /></translation>
@@ -4801,6 +4839,7 @@
 <translation id="8438328416656800239">Bytt til en smart nettleser</translation>
 <translation id="8438566539970814960">Gjør søking og surfing bedre</translation>
 <translation id="8439506636278576865">Tilby å oversette nettsider på dette språket</translation>
+<translation id="8440630305826533614">Linux-apper</translation>
 <translation id="8446884382197647889">Les mer</translation>
 <translation id="8447409163267621480">Inkluder enten Ctrl eller Alt</translation>
 <translation id="8448729345478502352">Gjør elementer på skjermen mindre eller større.</translation>
@@ -4845,6 +4884,7 @@
 <translation id="8497219075884839166">Windows Verktøy</translation>
 <translation id="8498214519255567734">Gjør det lettere å se på skjermen og lese i svakt lys</translation>
 <translation id="8498395510292172881">Forsett å lese i Chrome</translation>
+<translation id="8502536196501630039">For å bruke apper fra Google Play, må du først gjenopprette appene dine. Noe data kan ha blitt tapt.</translation>
 <translation id="8503813439785031346">Brukernavn</translation>
 <translation id="850875081535031620">Fant ingen skadelig programvare</translation>
 <translation id="8509646642152301857">Nedlastingen av ordboken for stavekontroll mislyktes.</translation>
@@ -4854,7 +4894,6 @@
 <translation id="8523493869875972733">Behold endringene</translation>
 <translation id="8523849605371521713">Lagt til som følge av retningslinjer</translation>
 <translation id="8525306231823319788">Full skjerm</translation>
-<translation id="8525982673980740788">Legg til nye funksjoner som bruker telefonens tilkobling på Chromebooken din</translation>
 <translation id="8528074251912154910">Legg til språk</translation>
 <translation id="8528962588711550376">Logger på.</translation>
 <translation id="8529026713753283969">Du mottar et varsel på denne telefonen, så ikke legg den fra deg.</translation>
@@ -4974,6 +5013,7 @@
 <translation id="8698464937041809063">Google-tegning</translation>
 <translation id="869884720829132584">Programmeny</translation>
 <translation id="869891660844655955">Utløpsdato</translation>
+<translation id="8699566574894671540">For å lå dette på, må du først velge Kontroller rettskriving mens du skriver inne i Rediger-menyen</translation>
 <translation id="870073306461175568">Fildelinger på nettverket</translation>
 <translation id="8701677791353449257">Enhetsnavnet må samsvare med det regulære uttrykket <ph name="REGEX" />.</translation>
 <translation id="8704521619148782536">Dette tar mye lengre tid enn normalt. Du kan fortsette å vente eller avbryte og prøve på nytt senere.</translation>
@@ -5013,6 +5053,7 @@
 
         &lt;p&gt;Du kan likevel konfigurere via kommandolinjen. Les mer om flagg og miljøvariabler i &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt;.&lt;/p&gt;</translation>
 <translation id="8755376271068075440">&amp;Større</translation>
+<translation id="8756969031206844760">Oppdater passord?</translation>
 <translation id="8757090071857742562">Skrivebordet kunne ikke castes. Sjekk om du bekreftet forespørselen om å begynne å dele skjermen din.</translation>
 <translation id="8757640015637159332">Start en offentlig økt</translation>
 <translation id="8757742102600829832">Velg en Chromebox du vil koble til</translation>
@@ -5169,7 +5210,9 @@
 <translation id="9009369504041480176">Laster opp (<ph name="PROGRESS_PERCENT" /> %) ...</translation>
 <translation id="9011163749350026987">Vis alltid ikonet</translation>
 <translation id="9011178328451474963">Den siste fanen</translation>
+<translation id="9013707997379828817">Administratoren henter tilbake enheten din. Vennligst lagre viktige filer, og start deretter på nytt. Alle data på enheten vil bli slettet.</translation>
 <translation id="9014987600015527693">Vis en annen telefon</translation>
+<translation id="9018218886431812662">Installasjonen er fullført</translation>
 <translation id="901834265349196618">e-post</translation>
 <translation id="9019062154811256702">Les og endre autofyll-innstillingene</translation>
 <translation id="9020362265352758658">4x</translation>
@@ -5193,6 +5236,7 @@
 <translation id="9038649477754266430">Bruk en prediksjonstjeneste for å laste inn sider raskere</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9039890312082871605">Slå av lyden for fanene</translation>
+<translation id="9040661932550800571">Oppdater passord for <ph name="ORIGIN" />?</translation>
 <translation id="9041692268811217999">Administratoren din har deaktivert tilgang til lokale filer på maskinen din</translation>
 <translation id="9042893549633094279">Personvern og sikkerhet</translation>
 <translation id="904451693890288097">Skriv inn passordet for «<ph name="DEVICE_NAME" />»:</translation>
@@ -5297,6 +5341,7 @@
 <translation id="9203478404496196495">Slå på lyden for fanen</translation>
 <translation id="9203904171912129171">Velg enhet</translation>
 <translation id="9203962528777363226">Administratoren til denne enheten har deaktivert tillegging av nye brukere</translation>
+<translation id="9213073329713032541">Installasjon startet vellykket.</translation>
 <translation id="9214520840402538427">Beklager. Oppstarten av attributtene for installasjonstid er tidsavbrutt. Ta kontakt med brukerstøtterepresentanten din.</translation>
 <translation id="9214695392875603905">Cupcake</translation>
 <translation id="9215293857209265904">«<ph name="EXTENSION_NAME" />» ble lagt til</translation>
@@ -5351,6 +5396,7 @@
 <translation id="988978206646512040">Tomme passordfraser er ikke tillatt</translation>
 <translation id="992032470292211616">Utvidelser, apper og temaer kan skade enheten din. Er du sikker på at du vil fortsette?</translation>
 <translation id="992592832486024913">Slå av ChromeVox (taletilbakemelding)</translation>
+<translation id="993540765962421562">Installering pågår.</translation>
 <translation id="994289308992179865">&amp;Gjenta</translation>
 <translation id="996250603853062861">Etablerer sikker tilkobling ...</translation>
 <translation id="998747458861718449">I&amp;nspiser</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 962ca8cd..cf30dfaf8 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Zapisywanie danych w plikach i folderach otwieranych w aplikacji</translation>
 <translation id="3688526734140524629">Zmień kanał</translation>
 <translation id="3688578402379768763">Aktualne</translation>
-<translation id="3691214267321877444">Formy płatności i adresy z Google Pay.</translation>
 <translation id="3691231116639905343">Klawiatury</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> chce udostępnić Twój ekran</translation>
 <translation id="3693415264595406141">Hasło:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Pokaż skrót do aplikacji</translation>
 <translation id="3785727820640310185">Zapisano hasła do tej strony</translation>
-<translation id="3785852283863272759">Wyślij lokalizację strony w wiadomości e-mail</translation>
 <translation id="3786301125658655746">Jesteś offline</translation>
 <translation id="3788401245189148511">Będzie mógł:</translation>
 <translation id="3789841737615482174">Zainstaluj</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Załadowane z:</translation>
 <translation id="7180611975245234373">Odśwież</translation>
 <translation id="7180865173735832675">Dostosuj</translation>
+<translation id="7182359331070524176">Wybierz album w Zdjęciach Google</translation>
 <translation id="7186088072322679094">Zachowaj na pasku narzędzi</translation>
 <translation id="7187428571767585875">Wpisy w rejestrze, które zostaną usunięte lub zmienione:</translation>
 <translation id="7189234443051076392">Upewnij się, że masz wystarczająco dużo miejsca na urządzeniu</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Rozmiar</translation>
 <translation id="8030656706657716245">Dodaj drukarkę</translation>
 <translation id="8032244173881942855">Nie udało się przesłać karty.</translation>
+<translation id="8033827949643255796">wybrano</translation>
 <translation id="8033958968890501070">Przekroczono limit czasu</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Otwórz wszystkie w oknie &amp;incognito}=1{Otwórz w oknie &amp;incognito}few{Otwórz wszystkie (#) w oknie &amp;incognito}many{Otwórz wszystkie (#) w oknie &amp;incognito}other{Otwórz wszystkie (#) w oknie &amp;incognito}}</translation>
 <translation id="8037117027592400564">Odczyt całego tekstu mówionego przez syntezator mowy</translation>
@@ -4907,7 +4907,6 @@
 <translation id="8523493869875972733">Zachowaj zmiany</translation>
 <translation id="8523849605371521713">Dodane przez zasady</translation>
 <translation id="8525306231823319788">Pełny ekran</translation>
-<translation id="8525982673980740788">Dodaj nowe funkcje korzystające z połączenie telefonu z Chromebookiem</translation>
 <translation id="8528074251912154910">Dodaj języki</translation>
 <translation id="8528962588711550376">Loguję.</translation>
 <translation id="8529026713753283969">Na telefonie pojawi się powiadomienie, więc miej go pod ręką.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index e59d18e..669c5d82f 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Realizar gravações em arquivos e pastas que você abre no aplicativo</translation>
 <translation id="3688526734140524629">Mudar de canal</translation>
 <translation id="3688578402379768763">Atualizado</translation>
-<translation id="3691214267321877444">Formas de pagamento e endereços que usam o Google Pay.</translation>
 <translation id="3691231116639905343">Apps de teclado</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> quer compartilhar sua tela</translation>
 <translation id="3693415264595406141">Senha:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Mostrar atalho para aplicativos</translation>
 <translation id="3785727820640310185">Senhas salvas para este site</translation>
-<translation id="3785852283863272759">Local da página do e-mail</translation>
 <translation id="3786301125658655746">Você está off-line</translation>
 <translation id="3788401245189148511">Ele poderia:</translation>
 <translation id="3789841737615482174">Instalar</translation>
@@ -4041,6 +4039,7 @@
 <translation id="7175353351958621980">Carregado de:</translation>
 <translation id="7180611975245234373">Atualizar</translation>
 <translation id="7180865173735832675">Personalizar</translation>
+<translation id="7182359331070524176">Selecione um álbum do Google Fotos</translation>
 <translation id="7186088072322679094">Manter na barra de ferramentas</translation>
 <translation id="7187428571767585875">Entradas de registro que devem ser removidas ou alteradas:</translation>
 <translation id="7189234443051076392">Verifique se há espaço suficiente no seu dispositivo</translation>
@@ -4616,6 +4615,7 @@
 <translation id="8028993641010258682">Tamanho</translation>
 <translation id="8030656706657716245">Adicionar impressora</translation>
 <translation id="8032244173881942855">Não é possível transmitir a guia.</translation>
+<translation id="8033827949643255796">selecionado</translation>
 <translation id="8033958968890501070">Expirada</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Abrir tudo em &amp;janela anônima}=1{Abrir em &amp;janela anônima}one{Abrir tudo (#) em &amp;janela anônima}other{Abrir tudo (#) em &amp;janela anônima}}</translation>
 <translation id="8037117027592400564">Ler todo texto falado usando voz sintetizada</translation>
@@ -4909,7 +4909,6 @@
 <translation id="8523493869875972733">Manter alterações</translation>
 <translation id="8523849605371521713">Adicionada por uma política</translation>
 <translation id="8525306231823319788">Tela cheia</translation>
-<translation id="8525982673980740788">Adicione novos recursos que usam a conexão do seu smartphone ao Chromebook</translation>
 <translation id="8528074251912154910">Adicionar idiomas</translation>
 <translation id="8528962588711550376">Fazendo login.</translation>
 <translation id="8529026713753283969">Você receberá uma notificação neste smartphone para mantê-lo por perto.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 80cb269..d81a44a 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1783,7 +1783,6 @@
 <translation id="3688507211863392146">Escrever em ficheiros e pastas que são abertos na aplicação</translation>
 <translation id="3688526734140524629">Alterar canal</translation>
 <translation id="3688578402379768763">Atualizado</translation>
-<translation id="3691214267321877444">Métodos de pagamento e endereços com o Google Pay.</translation>
 <translation id="3691231116639905343">Aplicações de teclado</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> pretende partilhar o seu ecrã.</translation>
 <translation id="3693415264595406141">Palavra-passe:</translation>
@@ -1855,7 +1854,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Mostrar Atalho das Aplicações</translation>
 <translation id="3785727820640310185">Palavras-passe guardadas para este site</translation>
-<translation id="3785852283863272759">Localização da página de email</translation>
 <translation id="3786301125658655746">Está offline</translation>
 <translation id="3788401245189148511">Esta poderia:</translation>
 <translation id="3789841737615482174">Instalar</translation>
@@ -4041,6 +4039,7 @@
 <translation id="7175353351958621980">Carregado de:</translation>
 <translation id="7180611975245234373">Atualizar</translation>
 <translation id="7180865173735832675">Personalizar</translation>
+<translation id="7182359331070524176">Selecionar um álbum do Google Fotos</translation>
 <translation id="7186088072322679094">Manter na Barra de ferramentas</translation>
 <translation id="7187428571767585875">Entradas de registo a remover ou a alterar:</translation>
 <translation id="7189234443051076392">Certifique-se de que existe espaço suficiente no seu dispositivo.</translation>
@@ -4616,6 +4615,7 @@
 <translation id="8028993641010258682">Tamanho</translation>
 <translation id="8030656706657716245">Adicionar impressora</translation>
 <translation id="8032244173881942855">Não é possível transmitir o separador.</translation>
+<translation id="8033827949643255796">selecionado</translation>
 <translation id="8033958968890501070">Limite de tempo</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Abrir todos numa &amp;janela de navegação anónima}=1{Abrir numa &amp;janela de navegação anónima}other{Abrir todos (#) numa &amp;janela de navegação anónima}}</translation>
 <translation id="8037117027592400564">Ler todo o texto falado através da voz sintetizada</translation>
@@ -4908,7 +4908,6 @@
 <translation id="8523493869875972733">Manter alterações</translation>
 <translation id="8523849605371521713">Adicionada pela política</translation>
 <translation id="8525306231823319788">Ecrã inteiro</translation>
-<translation id="8525982673980740788">Adicione novas funcionalidades que utilizam a ligação do telemóvel ao Chromebook.</translation>
 <translation id="8528074251912154910">Adicionar idiomas</translation>
 <translation id="8528962588711550376">A iniciar sessão.</translation>
 <translation id="8529026713753283969">Receberá uma notificação neste telemóvel, por isso, mantenha-o por perto.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 8cd92b9..3a34f09 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Scrie în fișierele și dosarele pe care le deschideți în aplicație</translation>
 <translation id="3688526734140524629">Schimbați canalul</translation>
 <translation id="3688578402379768763">Actualizat</translation>
-<translation id="3691214267321877444">Metodele de plată și adresele care folosesc Google Pay.</translation>
 <translation id="3691231116639905343">Aplicații pentru tastatură</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> dorește să acceseze ecranul</translation>
 <translation id="3693415264595406141">Parolă:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Afișați comanda rapidă pentru aplicații</translation>
 <translation id="3785727820640310185">Parolele salvate pentru acest site</translation>
-<translation id="3785852283863272759">Trimite prin e-mail locația paginii</translation>
 <translation id="3786301125658655746">Ești offline</translation>
 <translation id="3788401245189148511">Aceasta ar putea să:</translation>
 <translation id="3789841737615482174">Instalează</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Încărcată de la:</translation>
 <translation id="7180611975245234373">Actualizați</translation>
 <translation id="7180865173735832675">Personalizează</translation>
+<translation id="7182359331070524176">Selectează un album Google Foto</translation>
 <translation id="7186088072322679094">Păstrează în bara de instrumente</translation>
 <translation id="7187428571767585875">Intrări din registry care trebuie eliminate sau modificate:</translation>
 <translation id="7189234443051076392">Asigură-te că există spațiu suficient pe dispozitiv</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Dimensiune</translation>
 <translation id="8030656706657716245">Adaugă imprimanta</translation>
 <translation id="8032244173881942855">Nu se poate proiecta fila.</translation>
+<translation id="8033827949643255796">selectate</translation>
 <translation id="8033958968890501070">Expirare</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Deschide-le pe toate într-o fereastră &amp;incognito}=1{Deschide într-o fereastră &amp;incognito}few{Deschide-le pe toate (#) într-o fereastră &amp;incognito}other{Deschide-le pe toate (#) într-o fereastră &amp;incognito}}</translation>
 <translation id="8037117027592400564">Citește tot textul rostit folosind vorbirea sintetizată</translation>
@@ -4906,7 +4906,6 @@
 <translation id="8523493869875972733">Păstrează modificările</translation>
 <translation id="8523849605371521713">Adăugată de politică</translation>
 <translation id="8525306231823319788">Ecran complet</translation>
-<translation id="8525982673980740788">Adaugă funcții noi care folosesc conexiunea telefonului la Chromebook</translation>
 <translation id="8528074251912154910">Adaugă limbi</translation>
 <translation id="8528962588711550376">Se conectează.</translation>
 <translation id="8529026713753283969">Vei primi o notificare pe acest telefon, deci ține telefonul în apropiere.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 9cf5dba..07c436b 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -222,6 +222,7 @@
 <translation id="1316136264406804862">Поиск...</translation>
 <translation id="1316495628809031177">Синхронизация приостановлена.</translation>
 <translation id="1319979322914001937">В "Галерее" показан список избранных расширений из Интернет-магазина Chrome, которые можно установить прямо из приложения.</translation>
+<translation id="1322046419516468189">Просматривайте сохраненные пароли и управляйте ими на странице <ph name="SAVED_PASSWORDS_STORE" /></translation>
 <translation id="1326317727527857210">Чтобы получить доступ к вкладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="1327074568633507428">Принтер, подключенный к Виртуальному принтеру Google</translation>
 <translation id="1327977588028644528">Шлюз</translation>
@@ -417,11 +418,13 @@
 <translation id="1618268899808219593">Справочный &amp;центр</translation>
 <translation id="162035744160882748">Включить синхронизацию, персонализацию и другие сервисы Google</translation>
 <translation id="1620510694547887537">Камера</translation>
+<translation id="1623132449929929218">Эти изображения сейчас недоступны. Чтобы посмотреть коллекции обоев, подключитесь к Интернету.</translation>
 <translation id="1624026626836496796">Это нужно сделать только один раз. Данные аккаунта не будут сохранены.</translation>
 <translation id="1627276047960621195">Дескрипторы файлов</translation>
 <translation id="1627408615528139100">Файл уже скачан</translation>
 <translation id="1632803087685957583">Позволяет настроить подсказки, скорость повтора клавиш и т д.</translation>
 <translation id="1635033183663317347">Установлено службой поддержки</translation>
+<translation id="1635885551358739414">Для персонализации рекламы, а также Chrome и других сервисов Google, таких как Переводчик и Поиск, могут использоваться данные с сайтов, которые вы посещаете, а также история просмотров и действий в браузере. Изменить эти параметры можно в настройках.</translation>
 <translation id="1637224376458524414">Получите эту закладку на iPhone</translation>
 <translation id="1637765355341780467">Не удалось открыть профиль. Некоторые функции могут быть недоступны.</translation>
 <translation id="1639239467298939599">Загрузка</translation>
@@ -452,6 +455,7 @@
 <translation id="166179487779922818">Слишком короткий пароль.</translation>
 <translation id="1661867754829461514">PIN-код отсутствует</translation>
 <translation id="16620462294541761">К сожалению, не удалось подтвердить пароль. Повторите попытку.</translation>
+<translation id="1662550410081243962">Сохранять и автоматически подставлять платежные данные</translation>
 <translation id="166278006618318542">Алгоритм открытого ключа субъекта</translation>
 <translation id="166439687370499867">Изменять настройки общей сети запрещено</translation>
 <translation id="1665611772925418501">Не удалось изменить файл.</translation>
@@ -461,6 +465,7 @@
 <translation id="1673137583248014546">Сайт <ph name="URL" /> запрашивает доступ к производителю и модели вашего Электронного ключа</translation>
 <translation id="167832068858235403">уменьшить громкость</translation>
 <translation id="1679068421605151609">Инструменты разработчика</translation>
+<translation id="1680849702532889074">В процессе установки приложения для Linux произошла ошибка.</translation>
 <translation id="16815041330799488">Не предоставлять сайтам доступ к тексту и изображениям, скопированным в буфер обмена</translation>
 <translation id="1682548588986054654">Новое окно в режиме инкогнито</translation>
 <translation id="168715261339224929">Чтобы получить доступ к закладкам на всех ваших устройствах, включите синхронизацию.</translation>
@@ -496,6 +501,7 @@
 <translation id="1732215134274276513">Открепить вкладки</translation>
 <translation id="1734824808160898225">Возможно, <ph name="PRODUCT_NAME" /> не сможет обновляться автоматически.</translation>
 <translation id="1736419249208073774">Подробнее</translation>
+<translation id="1736827427463982819">Завершить работу Linux (бета)</translation>
 <translation id="1737968601308870607">Сообщить об ошибке</translation>
 <translation id="1741314857973421784">Далее</translation>
 <translation id="174173592514158117">Показать все папки Google Play</translation>
@@ -668,6 +674,7 @@
 <translation id="1997484222658892567">Сайт <ph name="URL" /> запрашивает разрешение на постоянное хранение большого объема данных на вашем компьютере.</translation>
 <translation id="1997616988432401742">Ваши сертификаты</translation>
 <translation id="1999115740519098545">Запуск Chrome</translation>
+<translation id="2000419248597011803">Отправлять некоторые файлы cookie и поисковые запросы из адресной строки в поисковую систему по умолчанию</translation>
 <translation id="2001796770603320721">Открыть на Google Диске</translation>
 <translation id="2004663115385769400">Не удалось открыть файл с помощью приложения "$1"</translation>
 <translation id="200544492091181894">Вы можете в любое время изменить свой выбор в настройках.</translation>
@@ -694,6 +701,7 @@
 <translation id="2045969484888636535">Всегда блокировать сохранение cookie</translation>
 <translation id="204622017488417136">Устройство вернется к предыдущей версии Chrome. Локальные данные и аккаунты пользователей будут удалены. Это действие нельзя отменить.</translation>
 <translation id="2048182445208425546">Доступ к сетевому трафику</translation>
+<translation id="2048653237708779538">Действие недоступно</translation>
 <translation id="204914487372604757">Создать ярлык</translation>
 <translation id="2050339315714019657">Книжная</translation>
 <translation id="2053312383184521053">Данные о состоянии бездействия</translation>
@@ -782,6 +790,7 @@
 <translation id="2178098616815594724">Плагин <ph name="PEPPER_PLUGIN_NAME" /> в домене <ph name="PEPPER_PLUGIN_DOMAIN" /> пытается получить доступ к вашему компьютеру.</translation>
 <translation id="2178614541317717477">Скомпрометированный ЦС</translation>
 <translation id="218070003709087997">Укажите цифрами число копий для печати (от 1 до 999).</translation>
+<translation id="2183558561014688873">Чтобы обратиться к Ассистенту, включите и разблокируйте устройство, а затем скажите "Окей, Google".</translation>
 <translation id="2187895286714876935">Ошибка при импорте сертификата сервера</translation>
 <translation id="2187906491731510095">Расширения обновлены</translation>
 <translation id="2188881192257509750">Открыть приложение "<ph name="APPLICATION" />"</translation>
@@ -853,6 +862,7 @@
 <translation id="2282146716419988068">Процесс GPU</translation>
 <translation id="2282155092769082568">URL автоматической настройки:</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2283340219607151381">Сохранять и автоматически подставлять адреса</translation>
 <translation id="2286841657746966508">Платежный адрес</translation>
 <translation id="2288181517385084064">Перейти в режим видео</translation>
 <translation id="2288735659267887385">Специальные возможности</translation>
@@ -934,6 +944,7 @@
 <translation id="2425665904502185219">Общий размер файлов</translation>
 <translation id="2428510569851653187">Опишите, что вы делали, когда произошел сбой</translation>
 <translation id="2431027948063157455">Не удалось загрузить Google Ассистента. Проверьте подключение к Интернету и повторите попытку.</translation>
+<translation id="2432753757290432042">Обновите Linux (бета)</translation>
 <translation id="2433452467737464329">Добавьте в URL параметр запроса для автоматического обновления страницы: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Внешний вид</translation>
 <translation id="2433836460518180625">Только снимать блокировку устройства</translation>
@@ -1185,6 +1196,7 @@
 <translation id="2775104091073479743">Настроить отпечатки</translation>
 <translation id="2776441542064982094">Устройства для регистрации в сети не найдены. Если ваше устройство включено и подключено к Интернету, зарегистрируйте его согласно инструкциям, содержащимся в его руководстве по эксплуатации.</translation>
 <translation id="2781692009645368755">Google Pay</translation>
+<translation id="2782104745158847185">Не удалось установить приложение для Linux</translation>
 <translation id="2783298271312924866">Сохранено</translation>
 <translation id="2783321960289401138">Создать ярлык...</translation>
 <translation id="2783829359200813069">Выбор типа шифрования</translation>
@@ -1209,6 +1221,7 @@
 <translation id="2812944337881233323">Выйдите из Chrome и снова войдите в систему</translation>
 <translation id="2812989263793994277">Не показывать</translation>
 <translation id="2814489978934728345">Остановить загрузку этой страницы</translation>
+<translation id="281504910091592009">Просматривайте сохраненные пароли и управляйте ими на странице <ph name="BEGIN_LINK" />Аккаунт Google<ph name="END_LINK" /></translation>
 <translation id="2815500128677761940">Панель закладок</translation>
 <translation id="2815693974042551705">Папка с закладками</translation>
 <translation id="2818476747334107629">Сведения о принтере</translation>
@@ -1289,6 +1302,7 @@
 <translation id="2939938020978911855">Показать доступные устройства Bluetooth</translation>
 <translation id="2941112035454246133">Низкий</translation>
 <translation id="2942560570858569904">Ожидание...</translation>
+<translation id="2942581856830209953">Персонализировать эту страницу</translation>
 <translation id="2943400156390503548">Слайды</translation>
 <translation id="2943503720238418293">Слишком длинное название.</translation>
 <translation id="2946119680249604491">Добавить подключение</translation>
@@ -1769,12 +1783,12 @@
 <translation id="3688507211863392146">Запись данных в файлы и каталоги, открытые в приложении</translation>
 <translation id="3688526734140524629">Выбрать другую версию</translation>
 <translation id="3688578402379768763">Обновление не требуется</translation>
-<translation id="3691214267321877444">Способы оплаты и адреса из Google Pay.</translation>
 <translation id="3691231116639905343">Клавиатуры</translation>
 <translation id="3691267899302886494">Сайт <ph name="HOST" /> запрашивает доступ к вашему экрану.</translation>
 <translation id="3693415264595406141">Пароль:</translation>
 <translation id="3694027410380121301">Выбрать предыдущую вкладку</translation>
 <translation id="3699624789011381381">Адрес электронной почты</translation>
+<translation id="3699920817649120894">Отключить синхронизацию и персонализацию?</translation>
 <translation id="3700888195348409686">Показ на другом экране (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3702500414347826004">Стартовые страницы были изменены и теперь содержат URL <ph name="URL" />.</translation>
 <translation id="370415077757856453">Контент JavaScript заблокирован</translation>
@@ -1840,7 +1854,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Отображение ярлыков приложений</translation>
 <translation id="3785727820640310185">Сохраненные пароли для этого сайта</translation>
-<translation id="3785852283863272759">Отправить адрес страницы по почте</translation>
 <translation id="3786301125658655746">Вы работаете в автономном режиме.</translation>
 <translation id="3788401245189148511">Разрешения:</translation>
 <translation id="3789841737615482174">Установить</translation>
@@ -1872,6 +1885,7 @@
 <translation id="3827774300009121996">Полноэкранный режим</translation>
 <translation id="3828029223314399057">Искать в закладках</translation>
 <translation id="3830674330436234648">Воспроизведение невозможно</translation>
+<translation id="3831436149286513437">Автозаполнение при поиске на Google Диске</translation>
 <translation id="3831486154586836914">Активирован режим обзора.</translation>
 <translation id="383161972796689579">Владелец этого устройства отключил возможность добавлять новых пользователей</translation>
 <translation id="3834775135533257713">Не удалось установить приложение "<ph name="TO_INSTALL_APP_NAME" />", так как оно конфликтует с приложением "<ph name="INSTALLED_APP_NAME" />".</translation>
@@ -1905,6 +1919,7 @@
 <translation id="3871092408932389764">Самый низкий</translation>
 <translation id="3872220884670338524">Сохраненный аккаунт <ph name="USERNAME" /> на сайте <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Если вы не освободите пространство, устройство перестанет отвечать.</translation>
+<translation id="3873315167136380065">Чтобы включить эту настройку, <ph name="BEGIN_LINK" />сбросьте настройки синхронизации<ph name="END_LINK" /> и удалите кодовую фразу.</translation>
 <translation id="3878840326289104869">Создание контролируемого профиля</translation>
 <translation id="3879748587602334249">Диспетчер загрузки</translation>
 <translation id="3880709822663530586">Электронный ключ работает, только когда на устройстве включен Bluetooth.</translation>
@@ -2028,6 +2043,7 @@
 <translation id="4068776064906523561">Сохраненные отпечатки пальцев</translation>
 <translation id="407173827865827707">При нажатии</translation>
 <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: ошибка входа</translation>
+<translation id="4071828814509176232">Окей, Google</translation>
 <translation id="4074900173531346617">Сертификат для подписи электронной почты</translation>
 <translation id="407520071244661467">Масштаб</translation>
 <translation id="4075639477629295004">Невозможно транслировать файл "<ph name="FILE_NAME" />"</translation>
@@ -2095,6 +2111,7 @@
 <translation id="4192273449750167573">Проверить настройки на следующем экране</translation>
 <translation id="4193154014135846272">Документ Google</translation>
 <translation id="4194570336751258953">Включить нажатие от прикосновения</translation>
+<translation id="4195249722193633765">Установка приложения для Linux (бета)</translation>
 <translation id="4195643157523330669">Открыть в новой вкладке</translation>
 <translation id="4195814663415092787">Ранее открытые вкладки</translation>
 <translation id="4197674956721858839">Архивировать выбранные элементы</translation>
@@ -2155,7 +2172,9 @@
 <translation id="428608937826130504">8-й объект на панели запуска</translation>
 <translation id="4287502004382794929">Недостаточно программных лицензий для регистрации устройства. Чтобы решить эту проблему, свяжитесь с отделом продаж. Если вы считаете, что произошла ошибка, обратитесь в службу поддержки.</translation>
 <translation id="4289540628985791613">Обзор</translation>
+<translation id="4295072614469448764">Приложение доступно в терминале. Кроме того, на панель запуска мог быть добавлен значок.</translation>
 <translation id="4296575653627536209">Создать контролируемый профиль</translation>
+<translation id="4297219207642690536">Перезапустить и сбросить настройки</translation>
 <translation id="4297322094678649474">Настройки перевода</translation>
 <translation id="4300305918532693141">Чтобы изменить эту настройку, <ph name="BEGIN_LINK" />сбросьте параметры синхронизации<ph name="END_LINK" />.</translation>
 <translation id="4305227814872083840">длинная (2 с)</translation>
@@ -2191,6 +2210,7 @@
 <translation id="4370975561335139969">Указан неправильный адрес или пароль</translation>
 <translation id="437184764829821926">Расширенные настройки шрифтов</translation>
 <translation id="4372884569765913867">1x1</translation>
+<translation id="4374831787438678295">Установщик Linux</translation>
 <translation id="4375035964737468845">Открывание скачанных файлов</translation>
 <translation id="4377363674125277448">Возникла проблема с сертификатом сервера.</translation>
 <translation id="4378154925671717803">Телефон</translation>
@@ -2309,6 +2329,7 @@
 <translation id="4576541033847873020">Подключение устройства Bluetooth</translation>
 <translation id="4579581181964204535">Трансляция с сайта <ph name="HOST_NAME" /> невозможна</translation>
 <translation id="4580526846085481512">Действительно удалить объекты ($1)?</translation>
+<translation id="4582497162516204941">Установка Linux (бета)</translation>
 <translation id="4582563038311694664">Сбросить все настройки</translation>
 <translation id="4585793705637313973">Изменить страницу</translation>
 <translation id="4589268276914962177">Новый терминал</translation>
@@ -2552,6 +2573,7 @@
 <translation id="4953808748584563296">Аватар по умолчанию (оранжевый)</translation>
 <translation id="4955814292505481804">Годовая</translation>
 <translation id="4957949153200969297">Включите функции <ph name="IDS_SHORT_PRODUCT_NAME" />, связанные только с синхронизацией.</translation>
+<translation id="4959262764292427323">Пароли сохраняются в аккаунте Google и будут доступны на любом устройстве.</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> (<ph name="PROFILE_NAME" />)</translation>
 <translation id="496226124210045887">Выбранный каталог содержит конфиденциальные файлы. Предоставить пользователю "$1" постоянный доступ на чтение данных в этом каталоге?</translation>
 <translation id="4964455510556214366">Расположение</translation>
@@ -2731,6 +2753,7 @@
 <translation id="5240817131241497236">В Chrome изменились настройки синхронизации, персонализации и других сервисов Google. Это может повлиять на текущие настройки.</translation>
 <translation id="5241128660650683457">Просмотр ваших данных на посещаемых сайтах</translation>
 <translation id="5242724311594467048">Включить приложение "<ph name="EXTENSION_NAME" />"?</translation>
+<translation id="5243522832766285132">Повторите попытку через несколько секунд</translation>
 <translation id="5244474230056479698">Синхронизация с <ph name="EMAIL" /></translation>
 <translation id="5246282308050205996">Произошел сбой приложения <ph name="APP_NAME" />. Нажмите на это сообщение, чтобы перезапустить его.</translation>
 <translation id="5247051749037287028">Отображаемое название (необязательно)</translation>
@@ -2753,6 +2776,7 @@
 <translation id="5264148714798105376">Это может занять около минуты.</translation>
 <translation id="5264252276333215551">Подключитесь к Интернету, чтобы запустить приложение в киоск-режиме.</translation>
 <translation id="5265562206369321422">Не в Сети больше недели</translation>
+<translation id="5265797726250773323">Ошибка при установке</translation>
 <translation id="5266113311903163739">Ошибка при импорте Центра сертификации</translation>
 <translation id="5269977353971873915">Печать не выполнена</translation>
 <translation id="5271549068863921519">Сохранить пароль</translation>
@@ -2775,6 +2799,7 @@
 <translation id="529175790091471945">Форматировать устройство</translation>
 <translation id="5292195676005197571">У большинства ключей нужно просто нажать кнопку.</translation>
 <translation id="5293170712604732402">Восстановление настроек по умолчанию</translation>
+<translation id="5297082477358294722">Пароль сохранен. Просматривайте сохраненные пароли и управляйте ими на странице <ph name="SAVED_PASSWORDS_STORE" />.</translation>
 <translation id="5298219193514155779">Автор темы:</translation>
 <translation id="5299109548848736476">Запрет отслеживания</translation>
 <translation id="5299682071747318445">Все данные зашифрованы с помощью кодовой фразы</translation>
@@ -3003,6 +3028,7 @@
 <translation id="5612720917913232150">Сайт <ph name="URL" /> запрашивает данные о местоположении вашего компьютера.</translation>
 <translation id="5612734644261457353">Неверный пароль. Обратите внимание: если вы недавно изменили пароль, но не выходили из системы, значит новый пароль ещё не вступил в силу и необходимо указать старый.</translation>
 <translation id="5614190747811328134">Уведомление пользователя</translation>
+<translation id="5614553682702429503">Сохранение пароля</translation>
 <translation id="561698261642843490">Закройте Firefox</translation>
 <translation id="5618075537869101857">К сожалению, не удалось запустить киоск-приложение.</translation>
 <translation id="5618333180342767515">(это может занять несколько минут)</translation>
@@ -3043,6 +3069,7 @@
 <translation id="5677503058916217575">Язык страницы:</translation>
 <translation id="5677928146339483299">Заблокировано</translation>
 <translation id="5678550637669481956">Предоставлен доступ к тому <ph name="VOLUME_NAME" /> (чтение и запись данных).</translation>
+<translation id="5678784840044122290">Приложение Linux будет доступно в терминале. Кроме того, на панель запуска мог быть добавлен значок.</translation>
 <translation id="5678955352098267522">Просмотр данных на сайте <ph name="WEBSITE_1" /></translation>
 <translation id="5684661240348539843">Идентификатор объекта</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Не удалось отключиться от архива или электронного диска<ph name="END_BOLD" />
@@ -3138,6 +3165,7 @@
 <translation id="5832805196449965646">Добавить пользователя</translation>
 <translation id="583281660410589416">Неизвестно</translation>
 <translation id="5832976493438355584">Заблокировано</translation>
+<translation id="5833397272224757657">Использовать для персонализации информацию с посещенных вами сайтов и данные о действиях в браузере</translation>
 <translation id="5833610766403489739">Файл не найден. Проверьте параметр места для скачивания и повторите попытку.</translation>
 <translation id="5833726373896279253">Изменять данные настройки может только владелец:</translation>
 <translation id="5834581999798853053">Осталось <ph name="TIME" /> мин.</translation>
@@ -3191,6 +3219,7 @@
 <translation id="5908769186679515905">Блокировать Flash на сайтах</translation>
 <translation id="5910363049092958439">Сохранить изображение как...</translation>
 <translation id="5911737117543891828">Временно скачанные файлы с Google Диска будут удалены. Файлы, к которым вы разрешили офлайн-доступ, останутся на устройстве.</translation>
+<translation id="5911887972742538906">При установке приложения для Linux произошла ошибка.</translation>
 <translation id="5912378097832178659">&amp;Изменить поисковые системы...</translation>
 <translation id="5914724413750400082">Модуль (<ph name="MODULUS_NUM_BITS" /> бит):
   <ph name="MODULUS_HEX_DUMP" />
@@ -3377,6 +3406,7 @@
 <translation id="6198102561359457428">Выйти и войти снова</translation>
 <translation id="6198252989419008588">Изменить PIN-код</translation>
 <translation id="6199801702437275229">Получение информации о свободном месте…</translation>
+<translation id="6201792273624501289">Приложения для Linux</translation>
 <translation id="6204015976622790023">Ассистент будет предлагать вам подсказки, связанные с изображением на экране.</translation>
 <translation id="6205710420833115353">Некоторые операции займут больше времени, чем ожидалось. Прервать?</translation>
 <translation id="6206311232642889873">Копировать изображение</translation>
@@ -3853,6 +3883,7 @@
 <translation id="6945221475159498467">Выбрать</translation>
 <translation id="694592694773692225">Попытка переадресации на этой странице заблокирована</translation>
 <translation id="6949306908218145636">Добавить все вкладки в закладки…</translation>
+<translation id="6950627417367801484">Восстановить приложения</translation>
 <translation id="6951153907720526401">Обработчики платежей</translation>
 <translation id="6955446738988643816">Просмотр всплывающего окна</translation>
 <translation id="6957231940976260713">Название службы</translation>
@@ -3978,6 +4009,7 @@
 <translation id="7127980134843952133">История скачиваний</translation>
 <translation id="7131040479572660648">Просмотр данных на сайтах <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">Добавить &amp;страницу</translation>
+<translation id="7133578150266914903">Администратор возвращает ваше устройство к прежней версии системы. Выполнено <ph name="PROGRESS_PERCENT" />.</translation>
 <translation id="7134098520442464001">Уменьшить размер текста</translation>
 <translation id="7136694880210472378">Использовать по умолчанию</translation>
 <translation id="7136984461011502314">Добро пожаловать в <ph name="PRODUCT_NAME" /></translation>
@@ -4178,6 +4210,7 @@
 <translation id="7463006580194749499">Добавить пользователя</translation>
 <translation id="7464490149090366184">Не удалось выполнить архивирование, элемент "$1" уже присутствует в архиве.</translation>
 <translation id="7465778193084373987">URL отзыва сертификатов Netscape</translation>
+<translation id="7469406957790636836">Чтобы включить эту настройку, активируйте проверку правописания в разделе <ph name="BEGIN_LINK" />Языки и ввод<ph name="END_LINK" />.</translation>
 <translation id="7469894403370665791">Автоматически подключаться к этой сети</translation>
 <translation id="747114903913869239">Ошибка: не удается расшифровать расширение</translation>
 <translation id="7473753388963818366">Давайте настроим устройство <ph name="DEVICE_TYPE" /></translation>
@@ -4275,6 +4308,7 @@
 <translation id="7606992457248886637">Центры сертификации</translation>
 <translation id="7607002721634913082">Приостановлен</translation>
 <translation id="7607274158153386860">Запросить версию сайта для планшетных ПК</translation>
+<translation id="7609148976235050828">Подключитесь к Интернету и повторите попытку.</translation>
 <translation id="7611008212562900400">Поиск на устройстве, в приложениях и в Интернете…</translation>
 <translation id="7616214729753637086">Регистрация устройства…</translation>
 <translation id="7617366389578322136">Подключение к устройству "<ph name="DEVICE_NAME" />"</translation>
@@ -4343,6 +4377,7 @@
 <translation id="7730449930968088409">Снимок содержания экрана</translation>
 <translation id="7730494089396812859">Показать данные о резервных копиях в облаке</translation>
 <translation id="7732111077498238432">В этой сети установлены правила</translation>
+<translation id="7737238973539693982">Удаление Linux (бета)</translation>
 <translation id="773905249182896430">Защищать устройство от опасных сайтов</translation>
 <translation id="7740996059027112821">Стандартный</translation>
 <translation id="7748528009589593815">Предыдущая вкладка</translation>
@@ -4531,6 +4566,7 @@
 <translation id="7974936243149753750">Каемка экрана</translation>
 <translation id="7977551819349545646">Обновление Chromebox...</translation>
 <translation id="7978412674231730200">Закрытый ключ</translation>
+<translation id="7978450511781612192">Вы выйдете из аккаунта Google. Закладки, история, пароли и другие параметры перестанут синхронизироваться с ним.</translation>
 <translation id="7979036127916589816">Ошибка синхронизации</translation>
 <translation id="7980084013673500153">Идентификатор объекта: <ph name="ASSET_ID" /></translation>
 <translation id="7981313251711023384">Разрешить предзагрузку страниц для повышения скорости работы браузера и поиска</translation>
@@ -4577,6 +4613,7 @@
 <translation id="8028993641010258682">Размер</translation>
 <translation id="8030656706657716245">Добавить принтер</translation>
 <translation id="8032244173881942855">Невозможно транслировать вкладку</translation>
+<translation id="8033827949643255796">Выделено.</translation>
 <translation id="8033958968890501070">Время истекло</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Открыть все в режиме &amp;инкогнито}=1{Открыть в режиме &amp;инкогнито}one{Открыть все (#) в режиме &amp;инкогнито}few{Открыть все (#) в режиме &amp;инкогнито}many{Открыть все (#) в режиме &amp;инкогнито}other{Открыть все (#) в режиме &amp;инкогнито}}</translation>
 <translation id="8037117027592400564">Доступ к тексту, произнесенному синтезатором речи</translation>
@@ -4695,6 +4732,7 @@
 <translation id="8226619461731305576">Очередь</translation>
 <translation id="8226742006292257240">Этот модуль случайным образом сгенерировал для вашего компьютера следующий пароль:</translation>
 <translation id="8227119283605456246">Прикрепить файл</translation>
+<translation id="8230134520748321204">Сохранить пароль для <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Чтобы нашим разработчикам было проще решить проблему, опишите, что произошло перед появлением сообщения об ошибке в профиле:</translation>
 <translation id="8234989666557591529">Выберите телефон для разблокировки устройства <ph name="DEVICE_TYPE" /></translation>
 <translation id="8239020549147958415">Синхронизировать с аккаунтом (<ph name="FULL_NAME" />)</translation>
@@ -4813,6 +4851,7 @@
 <translation id="8438328416656800239">Перейдите на умный браузер</translation>
 <translation id="8438566539970814960">Помогать улучшить просмотр страниц и поиск</translation>
 <translation id="8439506636278576865">Предлагать перевести страницы на этом языке</translation>
+<translation id="8440630305826533614">Приложения для Linux</translation>
 <translation id="8446884382197647889">Подробнее...</translation>
 <translation id="8447409163267621480">Сочетание должно начинаться с клавиши Ctrl или Alt</translation>
 <translation id="8448729345478502352">Уменьшить или увеличить объекты на экране</translation>
@@ -4857,6 +4896,7 @@
 <translation id="8497219075884839166">Утилиты Windows</translation>
 <translation id="8498214519255567734">Этот режим помогает снизить напряжение глаз при тусклом свете</translation>
 <translation id="8498395510292172881">Продолжить чтение в Chrome</translation>
+<translation id="8502536196501630039">Чтобы использовать приложения из Google Play, сначала восстановите свои приложения. Некоторые данные могли быть потеряны.</translation>
 <translation id="8503813439785031346">Имя пользователя</translation>
 <translation id="850875081535031620">Вредоносных программ не найдено.</translation>
 <translation id="8509646642152301857">Не удалось скачать словарь проверки правописания</translation>
@@ -4866,7 +4906,6 @@
 <translation id="8523493869875972733">Закрыть</translation>
 <translation id="8523849605371521713">Добавлено по правилу</translation>
 <translation id="8525306231823319788">Полноэкранный режим</translation>
-<translation id="8525982673980740788">Добавление в Chromebook функций, использующих подключение к мобильной сети.</translation>
 <translation id="8528074251912154910">Добавить языки</translation>
 <translation id="8528962588711550376">Выполняется вход.</translation>
 <translation id="8529026713753283969">Не убирайте телефон. Вы получите на него уведомление.</translation>
@@ -4986,6 +5025,7 @@
 <translation id="8698464937041809063">Рисунок Google</translation>
 <translation id="869884720829132584">Меню приложений</translation>
 <translation id="869891660844655955">Срок действия</translation>
+<translation id="8699566574894671540">Чтобы включить эту настройку, выберите в меню "Изменить" функцию "Проверять правописание при наборе текста".</translation>
 <translation id="870073306461175568">Совместный доступ к файлам в сети</translation>
 <translation id="8701677791353449257">Название устройства должно соответствовать регулярному выражению <ph name="REGEX" />.</translation>
 <translation id="8704521619148782536">Похоже, процесс займет больше времени, чем обычно. Вы можете подождать или нажать "Отмена" и повторить попытку позже.</translation>
@@ -5025,6 +5065,7 @@
 
           &lt;p&gt;Но вы все же можете выполнить конфигурацию с помощью командной строки. Подробнее о флагах и переменных окружения вы можете узнать в &lt;code&gt;руководстве к <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt;.&lt;/p&gt;</translation>
 <translation id="8755376271068075440">&amp;Крупнее</translation>
+<translation id="8756969031206844760">Обновить пароль?</translation>
 <translation id="8757090071857742562">Невозможно транслировать содержимое рабочего стола. Убедитесь, что вы открыли доступ к экрану.</translation>
 <translation id="8757640015637159332">Начать сеанс общего доступа</translation>
 <translation id="8757742102600829832">Выберите Chromebox, к которому нужно подключиться</translation>
@@ -5181,7 +5222,9 @@
 <translation id="9009369504041480176">Загрузка (<ph name="PROGRESS_PERCENT" />%)...</translation>
 <translation id="9011163749350026987">Всегда показывать значок</translation>
 <translation id="9011178328451474963">Последняя вкладка</translation>
+<translation id="9013707997379828817">Администратор вернул устройство к прежней версии системы. Сохраните все важные файлы и перезапустите устройство. При этом все данные будут удалены.</translation>
 <translation id="9014987600015527693">Другой телефон</translation>
+<translation id="9018218886431812662">Установка завершена</translation>
 <translation id="901834265349196618">электронная почта</translation>
 <translation id="9019062154811256702">Чтение и изменение настроек автозаполнения</translation>
 <translation id="9020362265352758658">4x</translation>
@@ -5205,6 +5248,7 @@
 <translation id="9038649477754266430">Использовать подсказки для ускорения загрузки страниц</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9039890312082871605">Отключить звук на вкладках</translation>
+<translation id="9040661932550800571">Обновить пароль для <ph name="ORIGIN" />?</translation>
 <translation id="9041692268811217999">Доступ к локальным файлам на вашем компьютере отключен администратором.</translation>
 <translation id="9042893549633094279">Конфиденциальность и безопасность</translation>
 <translation id="904451693890288097">Введите пароль для устройства "<ph name="DEVICE_NAME" />":</translation>
@@ -5309,6 +5353,7 @@
 <translation id="9203478404496196495">Включение звука на вкладке</translation>
 <translation id="9203904171912129171">Выберите устройство</translation>
 <translation id="9203962528777363226">Администратор этого устройства отключил возможность добавлять новых пользователей</translation>
+<translation id="9213073329713032541">Установка началась.</translation>
 <translation id="9214520840402538427">К сожалению, срок инициализации для атрибутов времени установки истек. Обратитесь в службу поддержки.</translation>
 <translation id="9214695392875603905">Кекс</translation>
 <translation id="9215293857209265904">Добавлено расширение или приложение: <ph name="EXTENSION_NAME" /></translation>
@@ -5363,6 +5408,7 @@
 <translation id="988978206646512040">Поле с кодовой фразой не должно быть пустым</translation>
 <translation id="992032470292211616">Расширения, приложения и темы могут причинить вред вашему мобильному устройству. Продолжить?</translation>
 <translation id="992592832486024913">Отключить ChromeVox (голосовое сопровождение)</translation>
+<translation id="993540765962421562">Выполняется установка</translation>
 <translation id="994289308992179865">&amp;Повтор</translation>
 <translation id="996250603853062861">Создание безопасного подключения...</translation>
 <translation id="998747458861718449">П&amp;росмотреть код</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 80007d23..59bc838 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Zapisovať do súborov a priečinkov, ktoré v aplikácii otvoríte</translation>
 <translation id="3688526734140524629">Zmeniť kanál</translation>
 <translation id="3688578402379768763">Aktuálne</translation>
-<translation id="3691214267321877444">Spôsoby platby a adresy pomocou Google Pay</translation>
 <translation id="3691231116639905343">Aplikácie klávesnice</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> chce zdieľať vašu obrazovku</translation>
 <translation id="3693415264595406141">Heslo:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Zobrazovať odkaz aplikácií</translation>
 <translation id="3785727820640310185">Uložené heslá pre tento web</translation>
-<translation id="3785852283863272759">Poslať lokalitu stránky e-mailom</translation>
 <translation id="3786301125658655746">Ste offline</translation>
 <translation id="3788401245189148511">Mohli by:</translation>
 <translation id="3789841737615482174">Inštalovať</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Načítané z:</translation>
 <translation id="7180611975245234373">Obnoviť</translation>
 <translation id="7180865173735832675">Prispôsobiť</translation>
+<translation id="7182359331070524176">Výber albumu Fotiek Google</translation>
 <translation id="7186088072322679094">Ponechať na paneli s nástrojmi</translation>
 <translation id="7187428571767585875">Záznamy databázy Registry, ktoré sa majú odstrániť alebo zmeniť:</translation>
 <translation id="7189234443051076392">Uistite sa, či máte v zariadení dosť miesta</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Veľkosť</translation>
 <translation id="8030656706657716245">Pridať tlačiareň</translation>
 <translation id="8032244173881942855">Kartu nie je možné prenášať.</translation>
+<translation id="8033827949643255796">vybrané</translation>
 <translation id="8033958968890501070">Časový limit vypršal</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Otvoriť všetky v okne inkognito}=1{Otvoriť v okne inkognito}few{Otvoriť všetky (#) v okne inkognito}many{Otvoriť všetky (#) v okne inkognito}other{Otvoriť všetky (#) v okne inkognito}}</translation>
 <translation id="8037117027592400564">Čítať akýkoľvek hovorený text prenesený pomocou hlasového syntetizátora</translation>
@@ -4906,7 +4906,6 @@
 <translation id="8523493869875972733">Zachovať zmeny</translation>
 <translation id="8523849605371521713">Pridané pravidlom</translation>
 <translation id="8525306231823319788">Celá obrazovka</translation>
-<translation id="8525982673980740788">Pridajte nové funkcie, ktoré využívajú pripojenie telefónu ku Chromebooku</translation>
 <translation id="8528074251912154910">Pridať jazyky</translation>
 <translation id="8528962588711550376">Prebieha prihlásenie.</translation>
 <translation id="8529026713753283969">Na tomto telefóne dostanete upozornenie, takže ho majte poruke.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index c061c2ac..6532acd9 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Zapisovanje v datoteke in mape, ki jih odprete v aplikaciji</translation>
 <translation id="3688526734140524629">Spremeni različico</translation>
 <translation id="3688578402379768763">Je posodobljeno</translation>
-<translation id="3691214267321877444">Plačilna sredstva in naslovi z Googlom Pay.</translation>
 <translation id="3691231116639905343">Aplikacije za tipkovnico</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> želi dostopati do vašega zaslona</translation>
 <translation id="3693415264595406141">Geslo:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Pokaži bližnjico do aplikacij</translation>
 <translation id="3785727820640310185">Shranjena gesla za to spletno mesto</translation>
-<translation id="3785852283863272759">Pošlji mesto strani po e-pošti</translation>
 <translation id="3786301125658655746">Povezava ni vzpostavljena</translation>
 <translation id="3788401245189148511">Lahko bi:</translation>
 <translation id="3789841737615482174">Namesti</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">Velikost</translation>
 <translation id="8030656706657716245">Dodajanje tiskalnika</translation>
 <translation id="8032244173881942855">Zavihka ni mogoče predvajati.</translation>
+<translation id="8033827949643255796">izbrani</translation>
 <translation id="8033958968890501070">Potek časovne omejitve</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Odpiranje vseh v &amp;oknu brez beleženja zgodovine}=1{Odpiranje v &amp;oknu brez beleženja zgodovine}one{Odpiranje vseh (#) v &amp;oknu brez beleženja zgodovine}two{Odpiranje vseh (#) v &amp;oknu brez beleženja zgodovine}few{Odpiranje vseh (#) v &amp;oknu brez beleženja zgodovine}other{Odpiranje vseh (#) v &amp;oknu brez beleženja zgodovine}}</translation>
 <translation id="8037117027592400564">Branje in izgovarjava vsega besedila z uporabo sintetiziranega govora</translation>
@@ -4906,7 +4905,6 @@
 <translation id="8523493869875972733">Ohranitev sprememb</translation>
 <translation id="8523849605371521713">Dodano s pravilnikom</translation>
 <translation id="8525306231823319788">Celozaslonsko</translation>
-<translation id="8525982673980740788">Dodajte v Chromebook nove funkcije, ki uporabljajo povezavo telefona</translation>
 <translation id="8528074251912154910">Dodaj jezike</translation>
 <translation id="8528962588711550376">Prijavljanje.</translation>
 <translation id="8529026713753283969">V ta telefon boste prejeli obvestilo, zato ga imejte pri roki.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 700dd0e5..f2595e66 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1778,7 +1778,6 @@
 <translation id="3688507211863392146">Уписивање у датотеке и директоријуме које отворите у апликацији</translation>
 <translation id="3688526734140524629">Промени канал</translation>
 <translation id="3688578402379768763">Ажурирано</translation>
-<translation id="3691214267321877444">Начини плаћања и адресе из Google Pay-а.</translation>
 <translation id="3691231116639905343">Апликације за тастатуру</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> жели да дели ваш екран</translation>
 <translation id="3693415264595406141">Лозинка:</translation>
@@ -1850,7 +1849,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Прикажи пречицу за апликације</translation>
 <translation id="3785727820640310185">Сачуване лозинке за овај сајт</translation>
-<translation id="3785852283863272759">Пошаљи имејл са локацијом странице</translation>
 <translation id="3786301125658655746">Офлајн сте</translation>
 <translation id="3788401245189148511">Могли би да:</translation>
 <translation id="3789841737615482174">Инсталирај</translation>
@@ -4611,6 +4609,7 @@
 <translation id="8028993641010258682">Величина</translation>
 <translation id="8030656706657716245">Додај штампач</translation>
 <translation id="8032244173881942855">Није успело пребацивање картице.</translation>
+<translation id="8033827949643255796">изабрано</translation>
 <translation id="8033958968890501070">Време је истекло</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Отвори све у &amp;прозору Без архивирања}=1{Отвори у &amp;прозору Без архивирања}one{Отвори све (#) у &amp;прозору Без архивирања}few{Отвори све (#) у &amp;прозору Без архивирања}other{Отвори све (#) у &amp;прозору Без архивирања}}</translation>
 <translation id="8037117027592400564">Читање свог текста изговореног помоћу синтетизованог говора</translation>
@@ -4903,7 +4902,6 @@
 <translation id="8523493869875972733">Задржи промене</translation>
 <translation id="8523849605371521713">Додале су смернице</translation>
 <translation id="8525306231823319788">Цео екран</translation>
-<translation id="8525982673980740788">Додајте нове функције које користе везу телефона са Chromebook-ом</translation>
 <translation id="8528074251912154910">Додај језике</translation>
 <translation id="8528962588711550376">Пријављивање.</translation>
 <translation id="8529026713753283969">Добићете обавештење на овом телефону, па га држите у близини.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 1ef96c6..a53300bf 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1781,7 +1781,6 @@
 <translation id="3688507211863392146">Skriva till filer och mappar som du öppnar i appen</translation>
 <translation id="3688526734140524629">Byt kanal</translation>
 <translation id="3688578402379768763">Uppdaterad</translation>
-<translation id="3691214267321877444">Betalningsmetoder och adresser som används med Google Pay.</translation>
 <translation id="3691231116639905343">Tangentbordsappar</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> vill dela skärmen</translation>
 <translation id="3693415264595406141">Lösenord:</translation>
@@ -1853,7 +1852,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Visa genväg för appar</translation>
 <translation id="3785727820640310185">Sparade lösenord för den här webbplatsen</translation>
-<translation id="3785852283863272759">Skicka sidadress i e-post</translation>
 <translation id="3786301125658655746">Du är offline</translation>
 <translation id="3788401245189148511">Appen eller tillägget skulle kunna:</translation>
 <translation id="3789841737615482174">Installera</translation>
@@ -4613,6 +4611,7 @@
 <translation id="8028993641010258682">Storlek</translation>
 <translation id="8030656706657716245">Lägg till skrivare</translation>
 <translation id="8032244173881942855">Det gick inte att casta fliken.</translation>
+<translation id="8033827949643255796">markerat</translation>
 <translation id="8033958968890501070">Tidsgränsen överskreds</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Öppna alla i ett &amp;inkognitofönster}=1{Öppna i ett &amp;inkognitofönster}other{Öppna alla (#) i ett &amp;inkognitofönster}}</translation>
 <translation id="8037117027592400564">Läsa all text som läses upp med syntetiskt tal</translation>
@@ -4905,7 +4904,6 @@
 <translation id="8523493869875972733">Behåll ändringarna</translation>
 <translation id="8523849605371521713">Har lagts till av en policy</translation>
 <translation id="8525306231823319788">Helskärm</translation>
-<translation id="8525982673980740788">Lägg till nya funktioner som använder mobilens anslutning till Chromebook</translation>
 <translation id="8528074251912154910">Lägg till språk</translation>
 <translation id="8528962588711550376">Inloggning sker</translation>
 <translation id="8529026713753283969">En avisering skickas till mobilen, så ha den i närheten.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 57fd9df..df2ea97 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1775,7 +1775,6 @@
 <translation id="3688507211863392146">Andika kwenye faili na folda unazofungua katika programu hii.</translation>
 <translation id="3688526734140524629">Badili kituo</translation>
 <translation id="3688578402379768763">Imesasishwa</translation>
-<translation id="3691214267321877444">Njia za kulipa na anwani zinazotumia Google Pay.</translation>
 <translation id="3691231116639905343">Programu za kibodi</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> inataka kushiriki skrini yako</translation>
 <translation id="3693415264595406141">Nenosiri:</translation>
@@ -1847,7 +1846,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Onyesha Mkato wa Programu</translation>
 <translation id="3785727820640310185">Manenosiri ya tovuti hii yamehifadhiwa</translation>
-<translation id="3785852283863272759">Tuma Mahali Ukurasa Ulipo kwa Barua Pepe</translation>
 <translation id="3786301125658655746">Uko nje ya mtandao</translation>
 <translation id="3788401245189148511">Ingeweza:</translation>
 <translation id="3789841737615482174">Sakinisha</translation>
@@ -4606,6 +4604,7 @@
 <translation id="8028993641010258682">Ukubwa</translation>
 <translation id="8030656706657716245">Ongeza Printa</translation>
 <translation id="8032244173881942855">Imeshindwa kutuma kichupo.</translation>
+<translation id="8033827949643255796">kimechaguliwa</translation>
 <translation id="8033958968890501070">Muda umekwisha</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Fungua zote &amp;katika dirisha fiche}=1{Fungua &amp;katika dirisha fiche}other{Fungua zote (#) &amp;katika dirisha fiche}}</translation>
 <translation id="8037117027592400564">Soma maandishi yote yaliyotamkwa ukitumia matamshi yaliyounganishwa</translation>
@@ -4899,7 +4898,6 @@
 <translation id="8523493869875972733">Hifadhi Mabadiliko</translation>
 <translation id="8523849605371521713">Imeongezwa na sera</translation>
 <translation id="8525306231823319788">Skrini nzima</translation>
-<translation id="8525982673980740788">Ongeza vipengele vipya vinavyotumia muunganisho wa simu yako kwenye Chromebook</translation>
 <translation id="8528074251912154910">Ongeza lugha</translation>
 <translation id="8528962588711550376">Inaingia.</translation>
 <translation id="8529026713753283969">Utapokea arifa kwenye simu hii, hivyo hakikisha kuwa unaweza kuifikia.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 0bf56c7a..a73fd4ae 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">பயன்பாட்டில் நீங்கள் திறக்கும் கோப்புகள் மற்றும் கோப்புறைகளில் எழுதலாம்</translation>
 <translation id="3688526734140524629">சேனலை மாற்று</translation>
 <translation id="3688578402379768763">புதுப்பித்த நிலையில்</translation>
-<translation id="3691214267321877444">Google Payவைப் பயன்படுத்தும் பேமெண்ட் முறைகள் மற்றும் முகவரிகள்.</translation>
 <translation id="3691231116639905343">கீபோர்ட் ஆப்ஸ்</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> உங்கள் திரையைப் பகிர விரும்புகிறது</translation>
 <translation id="3693415264595406141">கடவுச்சொல்:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">பயன்பாடுகளின் குறுக்குவழியைக் காட்டு</translation>
 <translation id="3785727820640310185">இந்தத் தளத்திற்குச் சேமிக்கப்பட்ட கடவுச்சொற்கள்</translation>
-<translation id="3785852283863272759">பக்க இருப்பிடத்தை மின்னஞ்சல் செய்</translation>
 <translation id="3786301125658655746">ஆஃப்லைனில் உள்ளீர்கள்</translation>
 <translation id="3788401245189148511">இது அணுக விரும்புபவை:</translation>
 <translation id="3789841737615482174">நிறுவுக</translation>
@@ -4613,6 +4611,7 @@
 <translation id="8028993641010258682">அளவு</translation>
 <translation id="8030656706657716245">பிரிண்டரைச் சேர்</translation>
 <translation id="8032244173881942855">தாவலை அனுப்ப முடியவில்லை.</translation>
+<translation id="8033827949643255796">தேர்ந்தெடுக்கப்பட்டன</translation>
 <translation id="8033958968890501070">நேரம் முடிந்தது</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{எல்லாவற்றையும் &amp;மறைநிலைச் சாளரத்தில் திற}=1{&amp;மறைநிலைச் சாளரத்தில் திற}other{எல்லாவற்றையும் (#) &amp;மறைநிலைச் சாளரத்தில் திற}}</translation>
 <translation id="8037117027592400564">தொகுக்கப்பட்ட பேச்சைப் பயன்படுத்திப் பேசப்படும் எல்லா உரையையும் படிக்கலாம்</translation>
@@ -4905,7 +4904,6 @@
 <translation id="8523493869875972733">மாற்றங்களை வைத்திரு</translation>
 <translation id="8523849605371521713">கொள்கை மூலம் சேர்க்கப்பட்டது</translation>
 <translation id="8525306231823319788">முழுத்திரை</translation>
-<translation id="8525982673980740788">Chromebookகில் உங்கள் ஃபோனின் இணைப்பைப் பயன்படுத்தும் புதிய அம்சங்களைச் சேர்க்கலாம்</translation>
 <translation id="8528074251912154910">மொழிகளைச் சேர்</translation>
 <translation id="8528962588711550376">உள்நுழைகிறீர்கள்.</translation>
 <translation id="8529026713753283969">இந்த மொபைலில் அறிவிப்பைப் பெறுவீர்கள் என்பதால், மொபைலை அருகில் வைக்கவும்.</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 03dbfa5..9eefaf76 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1756,7 +1756,6 @@
 <translation id="3688507211863392146">మీరు అనువర్తనంలో తెరిచే ఫైల్‌లు మరియు ఫోల్డర్‌ల్లో వ్రాయండి</translation>
 <translation id="3688526734140524629">ఛానెల్‌ను మార్చు</translation>
 <translation id="3688578402379768763">తాజాగా ఉంది</translation>
-<translation id="3691214267321877444">Google Payని ఉపయోగిస్తున్న చెల్లింపు పద్ధతులు మరియు చిరునామాలు.</translation>
 <translation id="3691231116639905343">కీబోర్డ్ యాప్‌లు</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> మీ స్క్రీన్‌ని షేర్ చేయాలనుకుంటోంది</translation>
 <translation id="3693415264595406141">పాస్‌వర్డ్:</translation>
@@ -1785,7 +1784,7 @@
 <translation id="3729506734996624908">అనుమతించబడిన సైట్‌లు</translation>
 <translation id="3732078975418297900">పంక్తి <ph name="ERROR_LINE" />లో ఎర్రర్ ఉంది</translation>
 <translation id="3733127536501031542">దశ-పైకితో SSL సర్వర్</translation>
-<translation id="3735740477244556633">ఇలా క్రమబద్ధీకరించండి</translation>
+<translation id="3735740477244556633">దీని ద్వారా క్రమీకరించు</translation>
 <translation id="3737274407993947948">Linuxను ఇన్‌స్టాల్ చేయడంలో ఎర్రర్...</translation>
 <translation id="3737536731758327622">మీ డౌన్‌లోడ్‌లు ఇక్కడ కనిపిస్తాయి</translation>
 <translation id="3738671331307774213">మీ గుర్తింపును ధృవీకరించడం ద్వారా మీ వ్యక్తిగత సమాచారాన్ని భద్రంగా కాపాడుకోవచ్చు</translation>
@@ -1827,7 +1826,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">అనువర్తనాల సత్వరమార్గాన్ని చూపు</translation>
 <translation id="3785727820640310185">ఈ సైట్ కోసం సేవ్ చేసిన పాస్‌వర్డ్‌లు</translation>
-<translation id="3785852283863272759">పేజీ స్థానాన్ని ఇమెయిల్ చేయి</translation>
 <translation id="3786301125658655746">మీరు ఆఫ్‌లైన్‌లో ఉన్నారు</translation>
 <translation id="3788401245189148511">ఇది వీటిని చేయాలనుకుంటోంది:</translation>
 <translation id="3789841737615482174">వ్యవస్థాపించు</translation>
@@ -3378,7 +3376,7 @@
 <translation id="6231881193380278751">పేజీని స్వయంచాలకంగా రిఫ్రెష్ చేయడానికి URLలో ప్రశ్న పరామితిని జోడించండి: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">బ్యాటరీ</translation>
 <translation id="6232116551750539448"><ph name="NAME" />కి కనెక్షన్ కోల్పోయింది</translation>
-<translation id="6235700927623181151">ఈ టాబ్ మీ డెస్క్‌టాప్‌ కంటెంట్‌ను షేర్ చేస్తోంది.</translation>
+<translation id="6235700927623181151">ఈ ట్యాబ్ మీ డెస్క్‌టాప్‌ కంటెంట్‌ను షేర్ చేస్తోంది.</translation>
 <translation id="6237816943013845465">మీ స్క్రీన్ రిజల్యూషన్‌ను సర్దుబాటు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది</translation>
 <translation id="6238923052227198598">లాక్ స్క్రీన్‌పై తాజా గమనికను ఉంచండి</translation>
 <translation id="6239558157302047471">&amp;ఫ్రేమ్ మళ్లీ లోడ్ చేయి</translation>
@@ -3522,7 +3520,7 @@
 <translation id="6451180435462401570">క్లౌడ్ ముద్రణ పరికరాలను నిర్వహించు</translation>
 <translation id="6451689256222386810">మీరు మీ రహస్య పదబంధాన్ని మర్చిపోతే లేదా ఈ సెట్టింగ్‌ను మార్చాలనుకుంటే, <ph name="BEGIN_LINK" />సమకాలీకరణను రీసెట్ చేయండి<ph name="END_LINK" />.</translation>
 <translation id="6452181791372256707">తిరస్కరించు</translation>
-<translation id="6455264371803474013">కొన్ని ముఖ్యమైన సైట్‌లలో మాత్రమే</translation>
+<translation id="6455264371803474013">కొన్ని నిర్దిష్ట సైట్‌లలో మాత్రమే</translation>
 <translation id="6455894534188563617">&amp;కొత్త ఫోల్డర్</translation>
 <translation id="6456394469623773452">శ్రేష్టమైనది</translation>
 <translation id="6456631036739229488">Smart Lock ఫోన్ మారింది. Smart Lockను అప్‌డేట్ చేయడానికి మీ పాస్‌వర్డ్‌ను నమోదు చేయండి. తదుపరిసారి, మీ ఫోన్ మీ <ph name="DEVICE_TYPE" />ను అన్‌లాక్ చేస్తుంది. సెట్టింగ్‌లలో Smart Lockని ఆఫ్ చేయండి.</translation>
@@ -4155,7 +4153,7 @@
 <translation id="7465778193084373987">Netscape సర్టిఫికెట్ రద్దు URL</translation>
 <translation id="7469894403370665791">స్వయంచాలకంగా ఈ నెట్‌వర్క్‌కి కనెక్ట్ చెయ్యి</translation>
 <translation id="747114903913869239">లోపం: పొడిగింపులను డీకోడ్ చేయడం సాధ్యం కాదు</translation>
-<translation id="7473753388963818366">మీ కోసం సిద్ధంగా ఉన్న మీ <ph name="DEVICE_TYPE" />ని పొందండి</translation>
+<translation id="7473753388963818366">మీ <ph name="DEVICE_TYPE" />ని మీ కోసం సిద్ధంగా ఉండేలా సెటప్ చేద్దాం రండి</translation>
 <translation id="7473891865547856676">వద్దు, ధన్యవాదాలు</translation>
 <translation id="747459581954555080">అన్నీ పునరుద్ధరించు</translation>
 <translation id="7475671414023905704">Netscape తప్పిపోయిన పాస్‌వర్డ్ URL</translation>
@@ -4547,6 +4545,7 @@
 <translation id="8028993641010258682">పరిమాణం</translation>
 <translation id="8030656706657716245">ప్రింటర్‌ను జోడించండి</translation>
 <translation id="8032244173881942855">ట్యాబ్‌ను ప్రసారం చేయడం సాధ్యపడలేదు.</translation>
+<translation id="8033827949643255796">ఎంచుకోబడ్డాయి</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{అన్నింటినీ &amp;అజ్ఞాత విండోలో తెరవండి}=1{&amp;అజ్ఞాత విండోలో తెరవండి}other{అన్నింటినీ (#) &amp;అజ్ఞాత విండోలో తెరవండి}}</translation>
 <translation id="8037117027592400564">సంశ్లేషణ ప్రసంగాన్ని ఉపయోగించి మాట్లాడిన మొత్తం వచనాన్ని చదవడం</translation>
 <translation id="8037357227543935929">అడగాలి (డిఫాల్ట్)</translation>
@@ -4833,7 +4832,6 @@
 <translation id="8523493869875972733">మార్పులను అలాగే ఉంచు</translation>
 <translation id="8523849605371521713">విధానం ద్వారా జోడించబడింది</translation>
 <translation id="8525306231823319788">పూర్తి స్క్రీన్</translation>
-<translation id="8525982673980740788">Chromebookకు మీ ఫోన్ కనెక్షన్‌ను ఉపయోగించే కొత్త ఫీచర్‌లను జోడించండి</translation>
 <translation id="8528074251912154910">భాషలను జోడించు</translation>
 <translation id="8528962588711550376">సైన్ ఇన్ అవుతోంది.</translation>
 <translation id="8529026713753283969">మీరు ఈ ఫోన్‌లో నోటిఫికేషన్ పొందుతారు, అందువలన ఫోన్‌ను సమీపంలో ఉంచండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index c177a19..041799b 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">เขียนไปยังไฟล์และโฟลเดอร์ที่คุณเปิดในแอปพลิเคชัน</translation>
 <translation id="3688526734140524629">เปลี่ยนช่อง</translation>
 <translation id="3688578402379768763">ทันสมัย</translation>
-<translation id="3691214267321877444">วิธีการชำระเงินและที่อยู่จาก Google Pay</translation>
 <translation id="3691231116639905343">แอปแป้นพิมพ์</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ต้องการแชร์หน้าจอของคุณ</translation>
 <translation id="3693415264595406141">รหัสผ่าน:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">แสดงทางลัดแอป</translation>
 <translation id="3785727820640310185">รหัสผ่านที่บันทึกไว้สำหรับเว็บไซต์นี้</translation>
-<translation id="3785852283863272759">ตำแหน่งหน้าเว็บอีเมล</translation>
 <translation id="3786301125658655746">คุณออฟไลน์อยู่</translation>
 <translation id="3788401245189148511">ส่วนขยายต้องการจะ:</translation>
 <translation id="3789841737615482174">ติดตั้ง</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">ขนาด</translation>
 <translation id="8030656706657716245">เพิ่มเครื่องพิมพ์</translation>
 <translation id="8032244173881942855">ไม่สามารถแคสต์แท็บ</translation>
+<translation id="8033827949643255796">เลือกแล้ว</translation>
 <translation id="8033958968890501070">หมดเวลา</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{เปิดทั้งหมดใน&amp;หน้าต่างที่ไม่ระบุตัวตน}=1{เปิดใน&amp;หน้าต่างที่ไม่ระบุตัวตน}other{เปิดทั้งหมด (#) ใน&amp;หน้าต่างที่ไม่ระบุตัวตน}}</translation>
 <translation id="8037117027592400564">อ่านข้อความทั้งหมดที่พูดโดยใช้เสียงสังเคราะห์</translation>
@@ -4906,7 +4905,6 @@
 <translation id="8523493869875972733">เก็บการเปลี่ยนแปลงไว้</translation>
 <translation id="8523849605371521713">เพิ่มตามนโยบาย</translation>
 <translation id="8525306231823319788">เต็มหน้าจอ</translation>
-<translation id="8525982673980740788">เพิ่มฟีเจอร์ใหม่ที่ใช้การเชื่อมต่อโทรศัพท์กับ Chromebook</translation>
 <translation id="8528074251912154910">เพิ่มภาษา</translation>
 <translation id="8528962588711550376">กำลังลงชื่อเข้าใช้</translation>
 <translation id="8529026713753283969">คุณจะได้รับการแจ้งเตือนในโทรศัพท์นี้ ดังนั้นโปรดนำโทรศัพท์มาไว้ใกล้ๆ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index cb31973d..f01ec0e 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Uygulamada açtığınız dosyalara ve klasörlere yazma</translation>
 <translation id="3688526734140524629">Kanal değiştir</translation>
 <translation id="3688578402379768763">Güncel</translation>
-<translation id="3691214267321877444">Google Pay'i kullanan ödeme yöntemleri ve adresler.</translation>
 <translation id="3691231116639905343">Klavye uygulamaları</translation>
 <translation id="3691267899302886494"><ph name="HOST" />, ekranınızı paylaşmak istiyor</translation>
 <translation id="3693415264595406141">Şifre:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Uygulamalar Kısayolunu Göster</translation>
 <translation id="3785727820640310185">Bu site için kaydedilen şifreler</translation>
-<translation id="3785852283863272759">Sayfa Konumunu E-posta olarak Gönder</translation>
 <translation id="3786301125658655746">Çevrimdışısınız</translation>
 <translation id="3788401245189148511">Şunları yapabilecek:</translation>
 <translation id="3789841737615482174">Yükle</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">Boyut</translation>
 <translation id="8030656706657716245">Yazıcı Ekle</translation>
 <translation id="8032244173881942855">Sekme yayınlanamıyor.</translation>
+<translation id="8033827949643255796">seçildi</translation>
 <translation id="8033958968890501070">Zaman aşımı</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Tümünü &amp;gizli pencerede aç}=1{&amp;Gizli pencerede aç}other{Tümünü (#) &amp;gizli pencerede aç}}</translation>
 <translation id="8037117027592400564">Sentezlenmiş konuşma özelliği kullanılarak söylenen tüm metni okuma</translation>
@@ -4906,7 +4905,6 @@
 <translation id="8523493869875972733">Değişiklikleri Koru</translation>
 <translation id="8523849605371521713">Politika tarafından eklendi</translation>
 <translation id="8525306231823319788">Tam ekran</translation>
-<translation id="8525982673980740788">Telefonunuzun Chromebook'unuz ile bağlantısını kullanan yeni özellikler ekleyin</translation>
 <translation id="8528074251912154910">Dil ekle</translation>
 <translation id="8528962588711550376">Oturum açılıyor.</translation>
 <translation id="8529026713753283969">Bu telefona bildirim geleceği için telefonu yakınınızda bulundurun.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 8d60d30..b25be81 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Записувати у файли та папки, які ви відкриваєте в програмі</translation>
 <translation id="3688526734140524629">Змінити версію</translation>
 <translation id="3688578402379768763">Оновлено</translation>
-<translation id="3691214267321877444">Способи оплати й адреси, пов’язані з Google Pay.</translation>
 <translation id="3691231116639905343">Додатки для клавіатури</translation>
 <translation id="3691267899302886494">Сайт <ph name="HOST" /> хоче отримати доступ до вашого екрана</translation>
 <translation id="3693415264595406141">Пароль:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Показувати ярлики додатків</translation>
 <translation id="3785727820640310185">Збережені паролі для цього сайту</translation>
-<translation id="3785852283863272759">Надіслати розташування сторінки електронною поштою</translation>
 <translation id="3786301125658655746">Ви в режимі офлайн</translation>
 <translation id="3788401245189148511">Зможе:</translation>
 <translation id="3789841737615482174">Встановити</translation>
@@ -4039,6 +4037,7 @@
 <translation id="7175353351958621980">Завантажено з:</translation>
 <translation id="7180611975245234373">Оновити</translation>
 <translation id="7180865173735832675">Налаштувати</translation>
+<translation id="7182359331070524176">Виберіть альбом Google Фото</translation>
 <translation id="7186088072322679094">Залишити на панелі інструментів</translation>
 <translation id="7187428571767585875">Записи в реєстрі, які буде видалено або змінено:</translation>
 <translation id="7189234443051076392">Переконайтеся, що на пристрої достатньо вільного місця</translation>
@@ -4614,6 +4613,7 @@
 <translation id="8028993641010258682">Розмір</translation>
 <translation id="8030656706657716245">Додати принтер</translation>
 <translation id="8032244173881942855">Не вдається транслювати вкладку.</translation>
+<translation id="8033827949643255796">виділено</translation>
 <translation id="8033958968890501070">Час очікування минув</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Відкрити всі в &amp;анонімному вікні}=1{Відкрити в &amp;анонімному вікні}one{Відкрити всі (#) в &amp;анонімному вікні}few{Відкрити всі (#) в &amp;анонімному вікні}many{Відкрити всі (#) в &amp;анонімному вікні}other{Відкрити всі (#) в &amp;анонімному вікні}}</translation>
 <translation id="8037117027592400564">Читати весь текст, відтворений за допомогою синтезованого мовлення</translation>
@@ -4906,7 +4906,6 @@
 <translation id="8523493869875972733">Залишити зміни</translation>
 <translation id="8523849605371521713">Додано політикою</translation>
 <translation id="8525306231823319788">На весь екран</translation>
-<translation id="8525982673980740788">Додайте нові функції, щоб використовувати з’єднання телефона на Chromebook</translation>
 <translation id="8528074251912154910">Додати мови</translation>
 <translation id="8528962588711550376">Виконується вхід.</translation>
 <translation id="8529026713753283969">На цей телефон надійде сповіщення, тому тримайте його поблизу.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 4c5cb0b..e1c35b6 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">Ghi vào têp và thư mục bạn mở trong ứng dụng</translation>
 <translation id="3688526734140524629">Thay đổi kênh</translation>
 <translation id="3688578402379768763">Cập nhật</translation>
-<translation id="3691214267321877444">Địa chỉ và phương thức thanh toán sử dụng Google Pay.</translation>
 <translation id="3691231116639905343">Ứng dụng bàn phím</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> muốn chia sẻ màn hình của bạn</translation>
 <translation id="3693415264595406141">Mật khẩu:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Hiển thị lối tắt cho ứng dụng</translation>
 <translation id="3785727820640310185">Đã lưu mật khẩu cho trang web này</translation>
-<translation id="3785852283863272759">Vị trí Trang Email</translation>
 <translation id="3786301125658655746">Bạn đang ngoại tuyến</translation>
 <translation id="3788401245189148511">Tiện ích/ứng dụng này có thể:</translation>
 <translation id="3789841737615482174">Cài đặt</translation>
@@ -4614,6 +4612,7 @@
 <translation id="8028993641010258682">Kích thước</translation>
 <translation id="8030656706657716245">Thêm máy in</translation>
 <translation id="8032244173881942855">Không thể truyền tab.</translation>
+<translation id="8033827949643255796">đã chọn</translation>
 <translation id="8033958968890501070">Hết giờ</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{Mở tất cả trong &amp;cửa sổ ẩn danh}=1{Mở trong &amp;cửa sổ ẩn danh}other{Mở tất cả (#) trong &amp;cửa sổ ẩn danh}}</translation>
 <translation id="8037117027592400564">Đọc tất cả văn bản được nói bằng giọng nói tổng hợp</translation>
@@ -4906,7 +4905,6 @@
 <translation id="8523493869875972733">Lưu thay đổi</translation>
 <translation id="8523849605371521713">Được thêm bởi chính sách</translation>
 <translation id="8525306231823319788">Toàn màn hình</translation>
-<translation id="8525982673980740788">Thêm các tính năng mới có thể sử dụng kết nối của điện thoại vào Chromebook của bạn</translation>
 <translation id="8528074251912154910">Thêm ngôn ngữ</translation>
 <translation id="8528962588711550376">Đang đăng nhập.</translation>
 <translation id="8529026713753283969">Bạn sẽ nhận được thông báo trên điện thoại này để giữ cho điện thoại ở gần.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 65632ad..20e5cf7 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1776,7 +1776,6 @@
 <translation id="3688507211863392146">写入您在此应用中打开的文件和文件夹</translation>
 <translation id="3688526734140524629">变更版本</translation>
 <translation id="3688578402379768763">已是最新</translation>
-<translation id="3691214267321877444">Google Pay 中存储的付款方式和地址信息。</translation>
 <translation id="3691231116639905343">键盘应用</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> 想共享您的屏幕</translation>
 <translation id="3693415264595406141">密码:</translation>
@@ -1848,7 +1847,6 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">显示应用快捷方式</translation>
 <translation id="3785727820640310185">已保存用于登录此网站的密码</translation>
-<translation id="3785852283863272759">用电子邮件发送网页位置</translation>
 <translation id="3786301125658655746">您处于离线状态</translation>
 <translation id="3788401245189148511">该扩展程序想要:</translation>
 <translation id="3789841737615482174">安装</translation>
@@ -4598,6 +4596,7 @@
 <translation id="8028993641010258682">大小</translation>
 <translation id="8030656706657716245">添加打印机</translation>
 <translation id="8032244173881942855">无法投射标签页。</translation>
+<translation id="8033827949643255796">已选中</translation>
 <translation id="8033958968890501070">已超时</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{在隐身窗口中打开全部网址(&amp;I)}=1{在隐身窗口中打开 1 个网址(&amp;I)}other{在隐身窗口中打开全部(# 个)网址(&amp;I)}}</translation>
 <translation id="8037117027592400564">读取使用合成语音说出的所有文字</translation>
@@ -4890,7 +4889,6 @@
 <translation id="8523493869875972733">保留更改</translation>
 <translation id="8523849605371521713">按政策添加</translation>
 <translation id="8525306231823319788">全屏</translation>
-<translation id="8525982673980740788">向您的 Chromebook 添加需使用您手机的互联网连接的新功能</translation>
 <translation id="8528074251912154910">添加语言</translation>
 <translation id="8528962588711550376">正在登录。</translation>
 <translation id="8529026713753283969">您会在此手机上收到通知,因此请一定将它放在您附近。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 1f11862..8de1c01 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1782,7 +1782,6 @@
 <translation id="3688507211863392146">寫入你在應用程式中開啟的檔案和資料夾</translation>
 <translation id="3688526734140524629">變更版本</translation>
 <translation id="3688578402379768763">最新狀態</translation>
-<translation id="3691214267321877444">使用 Google Pay 儲存的付款方式和地址資訊。</translation>
 <translation id="3691231116639905343">鍵盤應用程式</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> 要求分享螢幕畫面</translation>
 <translation id="3693415264595406141">密碼:</translation>
@@ -1854,7 +1853,6 @@
 <translation id="3783640748446814672">Alt</translation>
 <translation id="3785308913036335955">顯示應用程式捷徑</translation>
 <translation id="3785727820640310185">已儲存這個網站的密碼</translation>
-<translation id="3785852283863272759">傳送網頁位置</translation>
 <translation id="3786301125658655746">你處於離線狀態</translation>
 <translation id="3788401245189148511">要求下列權限:</translation>
 <translation id="3789841737615482174">安裝</translation>
@@ -4610,6 +4608,7 @@
 <translation id="8028993641010258682">大小</translation>
 <translation id="8030656706657716245">新增印表機</translation>
 <translation id="8032244173881942855">無法投放分頁。</translation>
+<translation id="8033827949643255796">已選取</translation>
 <translation id="8033958968890501070">逾時</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{在無痕式視窗中開啟所有書籤(&amp;I)}=1{在無痕式視窗中開啟(&amp;I)}other{在無痕式視窗中開啟全部 # 個書籤(&amp;I)}}</translation>
 <translation id="8037117027592400564">讀取使用合成語音朗讀的所有文字</translation>
@@ -4902,7 +4901,6 @@
 <translation id="8523493869875972733">保留變更</translation>
 <translation id="8523849605371521713">依政策新增</translation>
 <translation id="8525306231823319788">全螢幕</translation>
-<translation id="8525982673980740788">為 Chromebook 新增需使用手機連線的功能</translation>
 <translation id="8528074251912154910">新增語言</translation>
 <translation id="8528962588711550376">登入中。</translation>
 <translation id="8529026713753283969">這支手機會收到通知,因此請讓手機保持在適當距離範圍內。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index 5e1e6018..4fd9a4a 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -13,6 +13,7 @@
 <translation id="123620459398936149">‏سیستم‌عامل Chrome قادر به همگام‌سازی داده‌های شما نبود. لطفاً رمز عبارتی همگام‌سازی خود را به‌روز کنید.</translation>
 <translation id="127345590676626841">‏Chrome به صورت خودکار به‌روزرسانی می‌شود بنابراین همیشه جدیدترین نسخه را دارید. وقتی این بارگیری تمام شد، Chrome مجدداً شروع به کار می‌کند و می‌توانید کارتان را ادامه دهید.</translation>
 <translation id="1302523850133262269">‏لطفاً صبر کنید تا Chrome جدیدترین به‌روزرسانی‌های سیستم را نصب کند.</translation>
+<translation id="1312676208694947750">{0,plural, =0{‏به‌روزرسانی سیستم‌عامل Chrome دردسترس است}=1{‏به‌روزرسانی سیستم‌عامل Chrome دردسترس است}one{‏به‌روزرسانی سیستم‌عامل Chrome‏ از # روز پیش دردسترس است}other{‏به‌روزرسانی سیستم‌عامل Chrome‏ از # روز پیش دردسترس است}}</translation>
 <translation id="137466361146087520">‏Google Chrome نسخه بتا</translation>
 <translation id="1393853151966637042">‏دریافت راهنمایی برای استفاده از Chrome</translation>
 <translation id="1399397803214730675">‏این رایانه از قبل دارای نسخه جدیدتر Google Chrome است. اگر نرم‌افزار کار نمی‌کند، لطفاً Google Chrome را حذف نصب کرده و دوباره امتحان کنید.</translation>
@@ -29,6 +30,7 @@
 <translation id="1682634494516646069">‏Google Chrome نمی‌تواند مسیر داده‌های خود را بخواند یا در آن بنویسد: <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="1698376642261615901">‏Google Chrome یک مرورگر وب است که برنامه‌های کاربردی و صفحات وب را در یک چشم به هم زدن اجرا و باز می‌کند. استفاده از آن سریع و آسان است و همیشه در دسترس است. با برنامه‌های حفاظت در برابر فیشینگ و بدافزار تعبیه شده در Google Chrome، وب را با امنیت بیشتر مرور کنید.</translation>
 <translation id="1718131156967340976">‏انتخاب <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation>
+<translation id="1734234790201236882">‏Chrome این گذرواژه را در حساب Google شما ذخیره می‌کند. لازم نیست آن را به خاطر بسپارید.</translation>
 <translation id="174539241580958092">‏به دلیل وجود خطا در ورود به سیستم، Google Chrome قادر به همگام‌سازی داده‌های شما نبود.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1773601347087397504">‏دریافت راهنمایی برای استفاده از سیستم عامل Chrome </translation>
@@ -46,6 +48,7 @@
 <translation id="216054706567564023">‏Chrome را در تلفنتان نصب کنید. پیامکی به شماره تلفن بازیابی حساب شما ارسال خواهیم کرد.</translation>
 <translation id="2246246234298806438">‏زمانی که نمایش دهنده داخلی PDF وجود نداشته باشد، Google Chrome نمی‌تواند پیش‌نمایش چاپ را نشان دهد.</translation>
 <translation id="2252923619938421629">‏با گزارش تنظیمات کنونی، به بهتر شدن Google Chrome کمک کنید.</translation>
+<translation id="225363235161345695">{0,plural, =1{‏Chrome یک ساعت دیگر راه‌اندازی مجدد می‌شود}one{‏Chrome # ساعت دیگر راه‌اندازی مجدد می‌شود}other{‏Chrome # ساعت دیگر راه‌اندازی مجدد می‌شود}}</translation>
 <translation id="2286950485307333924">‏اکنون در سیستم Chrome هستید</translation>
 <translation id="2290014774651636340">‏کلیدهای Google API وجود ندارد. برخی از عملکردهای Google Chrome از کار خواهد افتاد.</translation>
 <translation id="2290095356545025170">‏آیا می‌خواهید Google Chrome را غیر فعال کنید؟</translation>
@@ -146,10 +149,13 @@
 <translation id="4891791193823137474">‏اجازه به Google Chrome برای اجرا در پس‌زمینه</translation>
 <translation id="4895437082222824641">‏باز کردن پیوند در &amp;برگه جدید Chrome</translation>
 <translation id="4921569541910214635">‏از رایانه به‌طور مشترک استفاده می‌کنید؟ اکنون می‌توانید Chrome را هر طور که دوست دارید، تنظیم کنید.</translation>
+<translation id="4945319281866068441">{0,plural, =1{‏سیستم‌عامل Chrome را ظرف یک روز بازراه‌اندازی کنید}one{‏سیستم‌عامل Chrome را ظرف # روز بازراه‌اندازی کنید}other{‏سیستم‌عامل Chrome را ظرف # روز بازراه‌اندازی کنید}}</translation>
 <translation id="4953650215774548573">‏تنظیم Google Chrome به عنوان مرورگر پیش‌فرضتان</translation>
 <translation id="495931528404527476">‏در Chrome</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5028489144783860647">‏Google Chrome قادر به همگام‌سازی داده‌های شما نبود. لطفاً رمز عبارتی همگام‌سازی خود را به‌روز کنید.</translation>
+<translation id="5062123544085870375">‏بازراه‌اندازی سیستم‌عامل Chrome</translation>
+<translation id="5090044601776247154">‏نمایه‌های کاربر تحت نظارت، از نسخه ۷۰ Google Chrome دیگر دردسترس نخواهد بود.</translation>
 <translation id="5132929315877954718">‏برنامه‌های کاربردی، بازی‌ها، افزونه‌ها و طرح‌های زمینه فوق‌العاده را برای Google Chrome کاوش کنید.</translation>
 <translation id="5166975452760862670">‏Google Chrome به این زبان نشان داده می‌شود</translation>
 <translation id="5170938038195470297">‏نمایهٔ شما نمی‌تواند استفاده شود زیرا مربوط به یک نسخه جدیدتر از Google Chrome است. بعضی از ویژگی‌ها ممکن است موجود نباشند. لطفاً یک مسیر دیگر برای نمایه تعیین کنید یا از نسخه جدیدتر Chrome استفاده کنید.</translation>
@@ -159,6 +165,8 @@
 <translation id="532046782124376502">‏اخطار: Google Chrome نمی تواند مانع از ثبت سابقه مرور شما توسط افزونه‌ها شود. برای غیرفعال کردن این افزونه در حالت ناشناس، این گزینه را لغو انتخاب کنید.</translation>
 <translation id="5386244825306882791">‏این برنامه همچنین صفحه‌ای را که هنگام راه‌اندازی Chrome یا جستجو از Omnibox نشان داده می‌شود، کنترل می‌کند.</translation>
 <translation id="5430073640787465221">‏فایل تنظیمات برگزیده شما خراب یا نامعتبر است. Google Chrome نمی‌تواند تنظیمات شما را بازیابی کند.</translation>
+<translation id="5483595757826856374">{0,plural, =0{‏Chrome هم‌اکنون راه‌اندازی مجدد می‌شود}=1{‏Chrome ‏۱ ثانیه دیگر راه‌اندازی مجدد می‌شود}one{‏Chrome ‏# ثانیه دیگر راه‌اندازی مجدد می‌شود}other{‏Chrome ‏# ثانیه دیگر راه‌اندازی مجدد می‌شود}}</translation>
+<translation id="5514308096618405748">‏ساخت سیستم‌عامل Chrome به کمک <ph name="BEGIN_LINK_CROS_OSS" />نرم‌افزار منبع آزاد<ph name="END_LINK_CROS_OSS" /> دیگری که Linux (بتا) است، امکان‌پذیر شده است.</translation>
 <translation id="556024056938947818">‏Google Chrome می‌خواهد گذرواژه‌ها را نمایش دهد.</translation>
 <translation id="5566025111015594046">‏Google Chrome (ورودی mDNS)</translation>
 <translation id="565744775970812598">‏<ph name="FILE_NAME" /> ممکن است خطرناک باشد، بنابراین Chrome آن را مسدود کرده است.</translation>
@@ -184,6 +192,7 @@
 <translation id="6291549208091401781">‏Google Chrome از قبل برای همه کاربران این رایانه نصب شده است.</translation>
 <translation id="6338556085225130112">‏به‌روزرسانی Google Chrome</translation>
 <translation id="6368958679917195344">‏Chrome OS با یک <ph name="BEGIN_LINK_CROS_OSS" />نرم‌افزار منبع آزاد<ph name="END_LINK_CROS_OSS" /> دیگر امکان‌پذیر است.</translation>
+<translation id="6468844726266617801">{0,plural, =1{‏Chrome را ظرف یک روز راه‌اندازی مجدد کنید}one{‏Chrome را ظرف # روز راه‌اندازی مجدد کنید}other{‏Chrome را ظرف # روز راه‌اندازی مجدد کنید}}</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">‏درحال به‌روزرسانی Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">‏شما از <ph name="PROFILE_EMAIL" /> برای همگام‌سازی موارد Chrome خودتان استفاده می‌کنید. برای به‌روزرسانی تنظیمات ترجیحی همگام‌سازی‌تان یا استفاده از Chrome بدون حساب Google، به <ph name="SETTINGS_LINK" /> مراجعه کنید.</translation>
@@ -195,10 +204,12 @@
 <translation id="683440813066116847">‏قانون ترافیک ورودی برای Google Chrome Canary به منظور اجازه به ترافیک mDNS .</translation>
 <translation id="686561893457936865">‏Chrome را همه‌ جا ببرید</translation>
 <translation id="6885412569789873916">‏برنامه‌های Chrome نسخه بتا</translation>
+<translation id="6964107240822114422">{0,plural, =0{‏به‌روزرسانی Chrome دردسترس است}=1{‏به‌روزرسانی Chrome دردسترس است}one{‏به‌روزرسانی Chrome از # روز پیش دردسترس است}other{‏به‌روزرسانی Chrome از # روز پیش دردسترس است}}</translation>
 <translation id="6967962315388095737">‏قانون ترافیک ورودی Google Chrome نسخه بتا برای امکان دادن به ترافیک mDNS.</translation>
 <translation id="6970811910055250180">درحال به‌روزرسانی دستگاه شما…</translation>
 <translation id="6982337800632491844">‏<ph name="DOMAIN" /> لازم می‌داند که شما شرایط خدمات زیر را قبل از استفاده از دستگاه خوانده و بپذیرید. این شرایط، شرایط سیستم عامل Google Chrome را بیشتر، اصلاح و محدود نمی‌کنند.</translation>
 <translation id="6989339256997917931">‏Google Chrome به روز شده است اما حداقل ۳۰ روز از آن استفاده نکرده‌اید.</translation>
+<translation id="7023651421574588884">‏سرپرست لازم می‌داند برای اعمال به‌روزرسانی، سیستم‌عامل Chrome را بازراه‌اندازی کنید</translation>
 <translation id="7098166902387133879">‏Google Chrome درحال استفاده از میکروفون شما است.</translation>
 <translation id="7106741999175697885">‏مدیر فعالیت‌ها - Google Chrome</translation>
 <translation id="7164397146364144019">‏می‌توانید با گزارش خودکار جزئیات حوادث امنیتی احتمالی به Google به ایمن‌تر شدن Chrome و استفاده آسان‌تر از آن کمک کنید.</translation>
@@ -211,8 +222,10 @@
 <translation id="7419046106786626209">‏سیستم‌عامل Chrome قادر به همگام‌سازی داده‌هایتان نبود زیرا همگام‌سازی برای دامنه شما قابل دسترسی نیست.</translation>
 <translation id="7459554271817304652">‏برای ذخیره ویژگی‌های مرورگر سفارشی شده خود در وب و دسترسی به آن‌ها از Google Chrome از هر رایانه دیگری، همگام‌سازی را راه‌اندازی کنید.</translation>
 <translation id="7473136999113284234">‏Chrome به صورت خودکار به‌روزرسانی می‌شود بنابراین همیشه جدیدترین نسخه را دارید.</translation>
+<translation id="7486227612705979895">‏Chrome برای ارائه پیشنهاد در نوار نشانی، به Drive شما دسترسی خواهد داشت</translation>
 <translation id="7535429826459677826">‏Google Chrome نسخه Dev</translation>
 <translation id="7552219221109926349">‏سیستم عامل Chrome به این زبان نشان داده می‌شود</translation>
+<translation id="7561940363513215021">{0,plural, =1{‏Chrome ‏۱ دقیقه دیگر راه‌اندازی مجدد می‌شود}one{‏Chrome ‏# دقیقه دیگر راه‌اندازی مجدد می‌شود}other{‏Chrome ‏# دقیقه دیگر راه‌اندازی مجدد می‌شود}}</translation>
 <translation id="7589360514048265910">‏این رایانه دیگر به‌روزرسانی‌های Google Chrome را دریافت نمی‌کند، زیرا Mac OS X نسخه ۱۰.۹ دیگر پشتیبانی نمی‌شود.</translation>
 <translation id="7592736734348559088">‏Google Chrome قادر به همگام‌سازی داده‌های شما نبود زیرا جزئیات ورود به حساب شما به‌روز نیست.</translation>
 <translation id="7626032353295482388">‏به Chrome خوش آمدید</translation>
@@ -234,9 +247,11 @@
 <translation id="8008534537613507642">‏نصب مجدد Chrome</translation>
 <translation id="8030318113982266900">درحال به روزرسانی دستگاه شما به کانال <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8032142183999901390">‏پس از حذف حسابتان از Chrome، ممکن است لازم باشد برای اعمال تغییرات، برگه‌های بازتان را تازه‌سازی کنید.</translation>
+<translation id="8077352834923175128">‏سرپرست از شما می‌خواهد برای اعمال این به‌روزرسانی، سیستم‌عامل Chrome را بازراه‌اندازی کنید</translation>
 <translation id="8129812357326543296">‏درباره &amp;Google Chrome</translation>
 <translation id="8179874765710681175">‏Chrome را روی تلفنتان نصب کنید. پیامکی به تلفن شما خواهیم فرستاد.</translation>
 <translation id="8183957050892517584">‏Chrome به‌طور امن جزئیات شخصی‌تان را ذخیره خواهد کرد تا نیازی نباشد دوباره آن‌ها را تایپ کنید.</translation>
+<translation id="8226081633851087288">{0,plural, =0{‏سیستم‌عامل Chrome اکنون بازراه‌اندازی می‌شود}=1{‏سیستم‌عامل Chrome ‏۱ ثانیه دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chrome # ثانیه دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chrome # ثانیه دیگر بازراه‌اندازی می‌شود}}</translation>
 <translation id="8255190535488645436">‏Google Chrome درحال استفاده از دوربین و میکروفون شما است.</translation>
 <translation id="8286862437124483331">‏Google Chrome در حال تلاش برای نشان دادن گذرواژه‌هاست. برای اجازه به این کار، گذرواژه Windows خود را تایپ کنید.</translation>
 <translation id="8290100596633877290">‏اوه! Google Chrome با اشکال مواجه شده است. دوباره راه‌اندازی شود؟</translation>
@@ -259,6 +274,7 @@
 <translation id="870251953148363156">‏به‌روزرسانی Goo&amp;gle Chrome</translation>
 <translation id="873133009373065397">‏Google Chrome نمی‌تواند مرورگر پیش‌فرض را تعیین یا تنظیم کند</translation>
 <translation id="8736674169840206667">‏سرپرست سیستم لازم می‌داند برای اعمال به‌روزرسانی، Chrome را راه‌اندازی مجدد کنید</translation>
+<translation id="8791470158600044404">{0,plural, =1{‏سیستم‌عامل Chrome ‏۱ دقیقه دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chrome # دقیقه دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chrome # دقیقه دیگر بازراه‌اندازی می‌شود}}</translation>
 <translation id="8796108026289707191">‏هم‌اکنون باید Google Chrome را راه‌اندازی مجدد کنید.</translation>
 <translation id="8823341990149967727">‏نسخه Chrome قدیمی است</translation>
 <translation id="884296878221830158">‏این برنامه همچنین صفحه‌ای را که هنگام راه‌اندازی Chrome یا کلیک کردن روی دکمه صفحه اصلی نشان داده می‌شود، کنترل می‌کند.</translation>
@@ -267,6 +283,7 @@
 <translation id="9026991721384951619">‏سیستم‌عامل Chrome قادر به همگام‌سازی داده‌هایتان نبود زیرا جزئیات ورود به سیستم حساب شما به‌روز نیست.</translation>
 <translation id="9067395829937117663">‏Google Chrome به Windows 7 یا بالاتر نیاز دارد.</translation>
 <translation id="9084668267983921457">‏گواهینامه احراز هویت تأیید نشد. لطفاً دوباره به سیستم Google Chrome وارد شوید یا برای دریافت اطلاعات بیشتر با سرپرستتان تماس بگیرید. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="909149346112452267">{0,plural, =1{‏سیستم‌عامل Chrome یک ساعت دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chrome # ساعت دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chrome # ساعت دیگر بازراه‌اندازی می‌شود}}</translation>
 <translation id="911206726377975832">داده‌های مرور شما نیز حذف شود؟</translation>
 <translation id="919706545465235479">‏به‌روزرسانی Chrome برای شروع همگام‌سازی</translation>
 <translation id="924447568950697217">‏تنظیم Chrome به‌عنوان مرورگر پیش‌فرض</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index d9e986b..b5d5d765 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -13,6 +13,7 @@
 <translation id="123620459398936149">Chrome OS kunne ikke synkronisere dataene dine. Oppdater passordfrasen for synkronisering.</translation>
 <translation id="127345590676626841">Chrome oppdateres automatisk, sånn at du alltid har den nyeste versjonen. Når denne nedlastingen er fullført, kommer Chrome til å starte på nytt, og du er i gang.</translation>
 <translation id="1302523850133262269">Vent mens Chrome installerer de nyeste systemoppdateringene.</translation>
+<translation id="1312676208694947750">{0,plural, =0{En Chrome OS-oppdatering er tilgjengelig}=1{En Chrome OS-oppdatering er tilgjengelig}other{En Chrome OS-oppdatering har vært tilgjengelig i # dager}}</translation>
 <translation id="137466361146087520">Google Chrome Beta</translation>
 <translation id="1393853151966637042">Oppsøk brukerstøtten</translation>
 <translation id="1399397803214730675">Denne datamaskinen har allerede en nyere versjon av Google Chrome. Hvis programvaren ikke fungerer, må du avinstallere Google Chrome og prøve på nytt.</translation>
@@ -29,6 +30,7 @@
 <translation id="1682634494516646069">Google Chrome kan ikke lese og skrive til sin egen datakatalog: <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="1698376642261615901">Google Chrome er en nettleser som kjører nettsider og programmer i ekspressfart. Den er rask, stabil og enkel å bruke. Google Chrome har innebygd beskyttelse mot skadelig programvare og svindelforsøk (nettfisking), slik at du kan føle deg tryggere når du surfer på nettet.</translation>
 <translation id="1718131156967340976">Velg <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation>
+<translation id="1734234790201236882">Chrome vil lagre passordet i Google-kontoen din, så du trenger ikke å huske det.</translation>
 <translation id="174539241580958092">Google Chrome kunne ikke synkronisere dataene dine på grunn av en påloggingsfeil.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1773601347087397504">Få hjelp med å bruke Chrome OS</translation>
@@ -46,6 +48,7 @@
 <translation id="216054706567564023">Installer Chrome på telefonen din. Vi sender en SMS til telefonnummeret ditt for kontogjenoppretting.</translation>
 <translation id="2246246234298806438">Google Chrome kan ikke vise forhåndsvisningen av utskrift når det innebygde PDF-visningsprogrammet mangler.</translation>
 <translation id="2252923619938421629">Bidra til å gjøre Google Chrome bedre ved å rapportere gjeldende innstillinger</translation>
+<translation id="225363235161345695">{0,plural, =1{Chrome startes på nytt om én time}other{Chrome startes på nytt om # timer}}</translation>
 <translation id="2286950485307333924">Nå er du logget på Chrome</translation>
 <translation id="2290014774651636340">API-nøkler for Google mangler. Noe funksjonalitet i Google Chrome blir deaktivert.</translation>
 <translation id="2290095356545025170">Er du sikker på at du vil avinstallere Google Chrome?</translation>
@@ -145,10 +148,13 @@
 <translation id="4891791193823137474">La Google Chrome kjøre i bakgrunnen</translation>
 <translation id="4895437082222824641">Åpne linken i en ny &amp;fane i Chrome</translation>
 <translation id="4921569541910214635">Deler du datamaskinen din med andre? Nå kan du konfigurere Chrome akkurat slik du vil.</translation>
+<translation id="4945319281866068441">{0,plural, =1{Start Chrome OS på nytt innen én dag}other{Start Chrome OS på nytt innen # dager}}</translation>
 <translation id="4953650215774548573">Bruk Google Chrome som standard nettleser</translation>
 <translation id="495931528404527476">I Chrome</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5028489144783860647">Google Chrome kunne ikke synkronisere dataene dine. Oppdater passordfrasen for synkronisering.</translation>
+<translation id="5062123544085870375">Start Chrome OS på nytt</translation>
+<translation id="5090044601776247154">Overvåkede brukerprofiler vil ikke lengre være tilgjengelig fra og med Google Chrome 70.</translation>
 <translation id="5132929315877954718">Oppdag flotte apper, spill, utvidelser og temaer for Google Chrome.</translation>
 <translation id="5166975452760862670">Google Chrome vises på dette språket</translation>
 <translation id="5170938038195470297">Profilen din kan ikke brukes fordi den er fra en nyere versjon av Google Chrome. Enkelte funksjoner kan være utilgjengelige. Angi en annen profilkatalog, eller bruk en nyere versjon av Chrome.</translation>
@@ -158,6 +164,8 @@
 <translation id="532046782124376502">Advarsel: Google Chrome kan ikke hindre utvidelser i å registrere nettlesingsloggen din. Du kan deaktivere utvidelsen i inkognitomodus ved å fjerne avmerkingen for dette alternativet.</translation>
 <translation id="5386244825306882791">Den styrer også hvilken side som vises når du starter Chrome eller søker fra multifunksjonsfeltet.</translation>
 <translation id="5430073640787465221">Innstillingsfilen er skadet eller ugyldig. Google Chrome kan ikke gjenopprette innstillingene dine.</translation>
+<translation id="5483595757826856374">{0,plural, =0{Chrome starter på nytt nå}=1{Chrome starter på nytt om 1 sekund}other{Chrome starter på nytt om # sekunder}}</translation>
+<translation id="5514308096618405748">Chrome OS muliggjøres av <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />, som Linux(Beta).</translation>
 <translation id="556024056938947818">Google Chrome prøver å vise passord.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-Inn)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> kan være farlig, så Chrome har blokkert den.</translation>
@@ -183,6 +191,7 @@
 <translation id="6291549208091401781">Google Chrome er allerede installert for alle brukerne på datamaskinen din.</translation>
 <translation id="6338556085225130112">Oppdaterer Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS muliggjøres av <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />.</translation>
+<translation id="6468844726266617801">{0,plural, =1{Start Chrome på nytt innen én dag}other{Start Chrome på nytt innen # dager}}</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome for utviklere</translation>
 <translation id="6566149418543181476">Oppdaterer Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Du bruker <ph name="PROFILE_EMAIL" /> for synkronisering av Chrome-tingene dine. For å oppdatere alternativene for synkronisering eller bruke Chrome uten Google-konto, kan du gå til <ph name="SETTINGS_LINK" />.</translation>
@@ -194,10 +203,12 @@
 <translation id="683440813066116847">Regel om innkommende trafikk for Google Chrome Canary for å tillate mDNS-trafikk.</translation>
 <translation id="686561893457936865">Bruk Chrome overalt</translation>
 <translation id="6885412569789873916">Chrome Beta-apper</translation>
+<translation id="6964107240822114422">{0,plural, =0{En Chrome-oppdatering er tilgjengelig}=1{En Chrome-oppdatering er tilgjengelig}other{En Chrome-oppdatering har vært tilgjengelig i # dager}}</translation>
 <translation id="6967962315388095737">Regel for å tillate innkommende mDNS-trafikk i Google Chrome Beta.</translation>
 <translation id="6970811910055250180">Oppdaterer enheten ...</translation>
 <translation id="6982337800632491844"><ph name="DOMAIN" /> krever at du leser og godtar følgende vilkår før du bruker denne enheten. Disse vilkårene utvider, endrer eller begrenser ikke Google Chrome OS-vilkårene.</translation>
 <translation id="6989339256997917931">Google Chrome har blitt oppdatert, men du har ikke brukt programmet på minst 30 dager.</translation>
+<translation id="7023651421574588884">Administratoren din krever at du starter Chrome OS på nytt for at en oppdatering skal tas i bruk</translation>
 <translation id="7098166902387133879">Google Chrome bruker mikrofonen din.</translation>
 <translation id="7106741999175697885">Oppgavebehandling – Google Chrome</translation>
 <translation id="7164397146364144019">Du kan bidra til å gjøre Chrome tryggere og enklere å bruke, ved å rapportere detaljer om mulige sikkerhetsbrudd til Google automatisk.</translation>
@@ -210,8 +221,10 @@
 <translation id="7419046106786626209">Chrome OS kunne ikke synkronisere dataene dine fordi synkronisering ikke er tilgjengelig for domenet ditt.</translation>
 <translation id="7459554271817304652">Konfigurer Synkronisering til å lagre de personlig tilpassede nettleserfunksjonene dine på nettet slik at du kan bruke dem fra Google Chrome på enhver datamaskin.</translation>
 <translation id="7473136999113284234">Chrome oppdateres automatisk, sånn at du alltid har den nyeste versjonen.</translation>
+<translation id="7486227612705979895">Chrome får tilgang til disken din for å kunne gi deg forslag i adressefeltet</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7552219221109926349">Vis Chrome OS på dette språket</translation>
+<translation id="7561940363513215021">{0,plural, =1{Chrome starter på nytt om 1 minutt}other{Chrome starter på nytt om # minutter}}</translation>
 <translation id="7589360514048265910">Denne datamaskinen kommer ikke til å motta oppdateringer av Google Chrome lenger fordi Mac OS X 10.9 ikke støttes lenger.</translation>
 <translation id="7592736734348559088">Google Chrome kunne ikke synkronisere dataene dine. Dette skyldes at påloggingsopplysningene for kontoen din er foreldede.</translation>
 <translation id="7626032353295482388">Velkommen til Chrome</translation>
@@ -233,9 +246,11 @@
 <translation id="8008534537613507642">Installer Chrome på nytt</translation>
 <translation id="8030318113982266900">Oppdaterer enheten din til <ph name="CHANNEL_NAME" />-kanalen ...</translation>
 <translation id="8032142183999901390">Når du har fjernet kontoen din fra Chrome, kan det hende at du må laste inn de åpne fanene på nytt før endringene trer i kraft.</translation>
+<translation id="8077352834923175128">Administratoren din ber deg om å starte Chrome OS på nytt for at denne oppdateringen skal tas i bruk</translation>
 <translation id="8129812357326543296">Om &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Installer Chrome på telefonen din. Vi sender deg en SMS.</translation>
 <translation id="8183957050892517584">Chrome lagrer personopplysningene dine sikkert, slik at du slipper å skrive dem inn på nytt.</translation>
+<translation id="8226081633851087288">{0,plural, =0{Chrome OS vil nå starte på nytt}=1{Chrome OS vil starte på nytt om 1 sekund}other{Chrome OS vil starte på nytt om # sekunder}}</translation>
 <translation id="8255190535488645436">Google Chrome bruker kameraet og mikrofonen din.</translation>
 <translation id="8286862437124483331">Google Chrome forsøker å vise passord. Skriv inn Windows-passordet ditt for å tillate dette.</translation>
 <translation id="8290100596633877290">Google Chrome har fått et programstopp. Vil du starte på nytt nå?</translation>
@@ -258,6 +273,7 @@
 <translation id="870251953148363156">Oppdater &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome kan ikke fastslå eller angi standardnettleseren</translation>
 <translation id="8736674169840206667">Administratoren din krever at du starter Chrome på nytt for at en oppdatering skal tas i bruk</translation>
+<translation id="8791470158600044404">{0,plural, =1{Chrome OS vil starte på nytt om 1 minutt}other{Chrome OS vil starte på nytt om # minutter}}</translation>
 <translation id="8796108026289707191">Du bør starte Google Chrome på nytt nå.</translation>
 <translation id="8823341990149967727">Chrome er utdatert</translation>
 <translation id="884296878221830158">Den styrer også hvilken side som vises når du starter Chrome eller klikker på Startside-knappen.</translation>
@@ -266,6 +282,7 @@
 <translation id="9026991721384951619">Chrome OS kunne ikke synkronisere dataene fordi påloggingsopplysningene dine er foreldede.</translation>
 <translation id="9067395829937117663">Google Chrome krever Windows 7 eller nyere.</translation>
 <translation id="9084668267983921457">Autentiseringssertifikatet mislyktes. Logg på Google Chrome på nytt, eller kontakt administratoren din for å få mer informasjon. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="909149346112452267">{0,plural, =1{Chrome OS vil starte på nytt om én time}other{Chrome OS vil starte på nytt om # timer}}</translation>
 <translation id="911206726377975832">Vil du slette all nettleserdata også?</translation>
 <translation id="919706545465235479">Oppdater Chrome for å starte synkroniseringen</translation>
 <translation id="924447568950697217">Bruk Chrome som standard nettleser</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index f4663b3..5959e10 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -13,6 +13,7 @@
 <translation id="123620459398936149">Не удалось синхронизировать данные. Обновите кодовую фразу в Sync.</translation>
 <translation id="127345590676626841">Chrome обновляется автоматически, поэтому у вас всегда будет установлена последняя версия. После завершения скачивания и перезагрузки вы сможете продолжить работу.</translation>
 <translation id="1302523850133262269">Подождите, пока Chrome устанавливает последние обновления системы</translation>
+<translation id="1312676208694947750">{0,plural, =0{Доступно обновление Chrome OS}=1{Доступно обновление Chrome OS}one{Обновление Chrome OS доступно # день}few{Обновление Chrome OS доступно # дня}many{Обновление Chrome OS доступно # дней}other{Обновление Chrome OS доступно # дня}}</translation>
 <translation id="137466361146087520">Google Chrome (бета)</translation>
 <translation id="1393853151966637042">Справочный центр</translation>
 <translation id="1399397803214730675">На компьютере уже установлена последняя версия браузера Google Chrome. Если он не работает, удалите его и установите снова.</translation>
@@ -29,6 +30,7 @@
 <translation id="1682634494516646069">Браузеру Google Chrome не может выполнять операции чтения и записи в каталоге данных <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="1698376642261615901">Google Chrome – это быстрый и удобный браузер для работы с веб-страницами и приложениями. Он надежен и прост в использовании. Вы можете просматривать страницы в Интернете, положившись на систему защиту от вредоносного ПО и фишинга, которая уже встроена в Google Chrome.</translation>
 <translation id="1718131156967340976">Выберите <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation>
+<translation id="1734234790201236882">Этот пароль будет сохранен в аккаунте Google. Вам не нужно его запоминать.</translation>
 <translation id="174539241580958092">Google Chrome не удалось синхронизировать данные из-за ошибки входа в аккаунт.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1773601347087397504">Помощь по использованию Chrome OS</translation>
@@ -46,6 +48,7 @@
 <translation id="216054706567564023">Установите Chrome на телефон. Мы отправим SMS на номер, указанный в вашем аккаунте.</translation>
 <translation id="2246246234298806438">Если отсутствует встроенный просмотрщик PDF, предварительный просмотр в Google Chrome невозможен.</translation>
 <translation id="2252923619938421629">Отправьте отчет о текущих настройках Google Chrome и помогите усовершенствовать работу браузера</translation>
+<translation id="225363235161345695">{0,plural, =1{Chrome перезапустится через 1 час}one{Chrome перезапустится через # час}few{Chrome перезапустится через # часа}many{Chrome перезапустится через # часов}other{Chrome перезапустится через # часа}}</translation>
 <translation id="2286950485307333924">Вы вошли в Chrome</translation>
 <translation id="2290014774651636340">Отсутствуют ключи API Google. Некоторые функции Google Chrome могут не работать.</translation>
 <translation id="2290095356545025170">Вы действительно хотите удалить Google Chrome?</translation>
@@ -145,10 +148,13 @@
 <translation id="4891791193823137474">Разрешить работу Google Chrome в фоновом режиме</translation>
 <translation id="4895437082222824641">Открыть ссылку в новой вкладке браузера Chrome</translation>
 <translation id="4921569541910214635">Пользуетесь компьютером вместе с коллегой или другом? Теперь каждый из вас сможет настроить Chrome по своему вкусу.</translation>
+<translation id="4945319281866068441">{0,plural, =1{Перезапустите Chrome в течение дня}one{Перезапустите Chrome в течение # дня}few{Перезапустите Chrome в течение # дней}many{Перезапустите Chrome в течение # дней}other{Перезапустите Chrome в течение # дня}}</translation>
 <translation id="4953650215774548573">Сделать Google Chrome браузером по умолчанию</translation>
 <translation id="495931528404527476">В Chrome</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5028489144783860647">Google Chrome не удалось синхронизировать данные. Обновите кодовую фразу в Sync.</translation>
+<translation id="5062123544085870375">Перезапуск Chrome OS</translation>
+<translation id="5090044601776247154">Начиная с версии Chrome 70 контролируемые профили станут недоступны.</translation>
 <translation id="5132929315877954718">Широкий выбор приложений, игр, расширений и тем для Google Chrome.</translation>
 <translation id="5166975452760862670">Этот язык сейчас используется в Google Chrome</translation>
 <translation id="5170938038195470297">Использовать этот профиль невозможно, так как он был создан в более новой версии Google Chrome. Некоторые функции могут быть недоступны. Укажите другой каталог профиля или установите более новую версию Chrome.</translation>
@@ -158,6 +164,8 @@
 <translation id="532046782124376502">Внимание! Google Chrome не может предотвратить запись расширений в историю просмотренных страниц. Чтобы отключить это расширение в режиме инкогнито, отмените этот параметр.</translation>
 <translation id="5386244825306882791">Кроме того, расширение изменило стартовую страницу Chrome и поисковую систему, используемую по умолчанию при вводе запроса в омнибокс.</translation>
 <translation id="5430073640787465221">Файл настроек поврежден или недействителен. Google Chrome не может восстановить ваши параметры.</translation>
+<translation id="5483595757826856374">{0,plural, =0{Chrome перезапускается}=1{Chrome перезапустится через 1 секунду}one{Chrome перезапустится через # секунду}few{Chrome перезапустится через # секунды}many{Chrome перезапустится через # секунд}other{Chrome перезапустится через # секунды}}</translation>
+<translation id="5514308096618405748">Chrome OS, как и Linux (бета-версия), работает благодаря дополнительному <ph name="BEGIN_LINK_CROS_OSS" />программному обеспечению с открытым исходным кодом<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="556024056938947818">Вводимые пароли будут отображаться в Google Chrome.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">Chrome заблокировал файл <ph name="FILE_NAME" /> как потенциально опасный.</translation>
@@ -183,6 +191,7 @@
 <translation id="6291549208091401781">Google Chrome уже установлен для всех пользователей вашего компьютера</translation>
 <translation id="6338556085225130112">Обновление Google Chrome…</translation>
 <translation id="6368958679917195344">Своим появлением Chrome OS обязана дополнительному <ph name="BEGIN_LINK_CROS_OSS" />программному обеспечению с открытым исходным кодом<ph name="END_LINK_CROS_OSS" />.</translation>
+<translation id="6468844726266617801">{0,plural, =1{Перезапустите Chrome в течение дня}one{Перезапустите Chrome в течение # дня}few{Перезапустите Chrome в течение # дней}many{Перезапустите Chrome в течение # дней}other{Перезапустите Chrome в течение # дня}}</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome для разработчиков</translation>
 <translation id="6566149418543181476">Обновление Google Chrome (<ph name="PROGRESS_PERCENT" />)…</translation>
 <translation id="6598387184982954187">Для синхронизации данных Chrome используется аккаунт <ph name="PROFILE_EMAIL" />. Изменить параметры синхронизации или отключить аккаунт можно в <ph name="SETTINGS_LINK" />.</translation>
@@ -194,10 +203,12 @@
 <translation id="683440813066116847">Разрешить в Google Chrome Canary передачу входящего трафика по протоколу mDNS</translation>
 <translation id="686561893457936865">Chrome всегда под рукой</translation>
 <translation id="6885412569789873916">Приложения Chrome (бета)</translation>
+<translation id="6964107240822114422">{0,plural, =0{Доступно обновление Chrome}=1{Доступно обновление Chrome}one{Обновление Chrome доступно # день}few{Обновление Chrome доступно # дня}many{Обновление Chrome доступно # дней}other{Обновление Chrome доступно # дня}}</translation>
 <translation id="6967962315388095737">Разрешить в Google Chrome (бета) передачу входящего трафика по протоколу mDNS</translation>
 <translation id="6970811910055250180">Обновление операционной системы…</translation>
 <translation id="6982337800632491844">До начала работы с устройством необходимо ознакомиться с Условиями использования на веб-сайте <ph name="DOMAIN" /> и принять их. Эти условия не дополняют, не заменяют и не ограничивают Условий использования Chrome OS.</translation>
 <translation id="6989339256997917931">Google Chrome был обновлен, однако вы не использовали его в течение последних 30 дней.</translation>
+<translation id="7023651421574588884">Администратор требует перезапустить Chrome OS для установки обновления.</translation>
 <translation id="7098166902387133879">Google Chrome использует микрофон.</translation>
 <translation id="7106741999175697885">Диспетчер задач - Google Chrome</translation>
 <translation id="7164397146364144019">Вы можете сделать защиту Chrome ещё надежнее. Просто разрешите автоматически отправлять в Google информацию о возможных проблемах безопасности.</translation>
@@ -210,8 +221,10 @@
 <translation id="7419046106786626209">Не удалось синхронизировать данные, поскольку сервис Sync недоступен в вашем домене.</translation>
 <translation id="7459554271817304652">Чтобы сохранить персонализированные функции для работы в Интернете и получить доступ к ним из Google Chrome на любом компьютере, необходимо настроить синхронизацию.</translation>
 <translation id="7473136999113284234">Chrome обновляется автоматически, поэтому у вас всегда будет установлена последняя версия.</translation>
+<translation id="7486227612705979895">Chrome получит доступ к Google Диску, чтобы вы могли просматривать рекомендации в адресной строке</translation>
 <translation id="7535429826459677826">Google Chrome для разработчиков</translation>
 <translation id="7552219221109926349">Отображать Chrome OS на этом языке</translation>
+<translation id="7561940363513215021">{0,plural, =1{Chrome перезапустится через 1 минуту}one{Chrome перезапустится через # минуту}few{Chrome перезапустится через # минуты}many{Chrome перезапустится через # минут}other{Chrome перезапустится через # минуты}}</translation>
 <translation id="7589360514048265910">Google Chrome больше не будет обновляться на этом компьютере, так как поддержка Mac OS X 10.9 прекращена.</translation>
 <translation id="7592736734348559088">Google Chrome не удалось синхронизировать данные, поскольку ваши учетные данные устарели.</translation>
 <translation id="7626032353295482388">Добро пожаловать в Chrome!</translation>
@@ -233,9 +246,11 @@
 <translation id="8008534537613507642">Переустановить Chrome</translation>
 <translation id="8030318113982266900">Переключение устройства на канал <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8032142183999901390">После удаления вашего аккаунта из Chrome может понадобиться перезагрузить открытые вкладки, чтобы изменения вступили в силу.</translation>
+<translation id="8077352834923175128">Администратор просит перезапустить Chrome OS для установки обновления.</translation>
 <translation id="8129812357326543296">О браузере &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Установите Chrome на телефоне. Мы отправим вам SMS.</translation>
 <translation id="8183957050892517584">Chrome будет хранить ваши данные в защищенном виде, поэтому их не придется вводить повторно.</translation>
+<translation id="8226081633851087288">{0,plural, =0{Chrome OS перезапускается}=1{Chrome OS перезапустится через 1 секунду}one{Chrome OS перезапустится через # секунду}few{Chrome OS перезапустится через # секунды}many{Chrome OS перезапустится через # секунд}other{Chrome OS перезапустится через # секунды}}</translation>
 <translation id="8255190535488645436">Google Chrome использует камеру и микрофон.</translation>
 <translation id="8286862437124483331">Чтобы просмотреть пароли, введите пароль своего аккаунта Windows.</translation>
 <translation id="8290100596633877290">Произошел сбой Google Chrome. Перезапустить?</translation>
@@ -258,6 +273,7 @@
 <translation id="870251953148363156">Обновить &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome не удалось определить или задать браузер по умолчанию</translation>
 <translation id="8736674169840206667">Администратор требует перезапустить Chrome для установки обновления</translation>
+<translation id="8791470158600044404">{0,plural, =1{Chrome OS перезапустится через 1 минуту}one{Chrome OS перезапустится через # минуту}few{Chrome OS перезапустится через # минуты}many{Chrome OS перезапустится через # минут}other{Chrome OS перезапустится через # минуты}}</translation>
 <translation id="8796108026289707191">Перезапустите Google Chrome</translation>
 <translation id="8823341990149967727">Версия Chrome устарела</translation>
 <translation id="884296878221830158">Кроме того, расширение изменило стартовую страницу Chrome и страницу, отображаемую при нажатии кнопки "Главная страница".</translation>
@@ -266,6 +282,7 @@
 <translation id="9026991721384951619">Не удалось выполнить синхронизацию, так как учетные данные устарели.</translation>
 <translation id="9067395829937117663">Для работы Google Chrome необходима ОС Windows 7 или более поздней версии.</translation>
 <translation id="9084668267983921457">Ошибка сертификата аутентификации. Войдите в Google Chrome ещё раз или обратитесь за информацией к администратору. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="909149346112452267">{0,plural, =1{Chrome OS перезапустится через 1 час}one{Chrome OS перезапустится через # час}few{Chrome OS перезапустится через # часа}many{Chrome OS перезапустится через # часов}other{Chrome OS перезапустится через # часа}}</translation>
 <translation id="911206726377975832">Также удалить данные о работе в браузере?</translation>
 <translation id="919706545465235479">Чтобы начать синхронизацию, обновите Chrome</translation>
 <translation id="924447568950697217">Как назначить Chrome браузером по умолчанию</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index 818c1e7..f6a5fa6 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -130,7 +130,7 @@
 <translation id="4561051373932531560">Google Chrome వెబ్‌లో మిమ్మళ్ని ఫోన్ నంబర్ క్లిక్ చెయ్యనిస్తుంది మరియు Skypeతో కాల్ చేస్తుంది!</translation>
 <translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేసారు. ఇప్పుడు మీరు మీ సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్‌మార్క్‌లు, చరిత్ర మరియు ఇతర సెట్టింగ్‌లను ప్రాప్యత చేయవచ్చు.</translation>
 <translation id="4571503333518166079">Chrome నోటిఫికేషన్ సెట్టింగ్‌లలోకి వెళ్లు</translation>
-<translation id="459622048091363950">ఓసారి Chromeకి యాక్సెస్ లభించాక, ఆపై వెబ్‌సైట్‌లకు ఏమైనా యాక్సెస్‌ కావాలంటే మిమ్మల్ని అడగవచ్చు.</translation>
+<translation id="459622048091363950">ఓసారి Chromeకి యాక్సెస్ లభించాక, ఆపై వెబ్‌సైట్‌లకు ఏమైనా యాక్సెస్‌ కావాలంటే అవి మిమ్మల్ని అడగవచ్చు.</translation>
 <translation id="4600710005438004015">Chromeని తాజా వెర్షన్‌కు అప్‌డేట్ చేయడం సాధ్యం కాలేదు, కనుక మీరు కొత్త ఫీచర్‌లు మరియు భద్రతా పరిష్కారాలను పొందలేరు.</translation>
 <translation id="4631713731678262610">Chrome మెనులో దాచండి</translation>
 <translation id="4633000520311261472">Chromeను సురక్షితం చేయడానికి, మేము <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />లో జాబితా చేయబడని మరియు మీకు తెలియకుండానే జోడించబడిన కొన్ని పొడిగింపులను నిలిపివేసాము.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f81d99dd..1e0da27c 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3959,6 +3959,7 @@
         "offline_pages/android/prefetch_background_task_android.cc",
         "offline_pages/android/prefetch_background_task_android.h",
         "offline_pages/android/prefetch_background_task_scheduler_android.cc",
+        "offline_pages/android/prefetch_configuration_impl_android.cc",
         "offline_pages/android/prefetched_pages_notifier_android.cc",
         "offline_pages/android/request_coordinator_factory.cc",
       ]
@@ -4522,6 +4523,7 @@
       "../android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java",
       "../android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java",
       "../android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java",
+      "../android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java",
       "../android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java",
       "../android/java/src/org/chromium/chrome/browser/omnibox/AnswersImage.java",
       "../android/java/src/org/chromium/chrome/browser/omnibox/AutocompleteController.java",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index c5a2d2d..27aee629 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3625,7 +3625,7 @@
 
     {"stop-non-timers-in-background",
      flag_descriptions::kStopNonTimersInBackgroundName,
-     flag_descriptions::kStopNonTimersInBackgroundDescription, kOsAndroid,
+     flag_descriptions::kStopNonTimersInBackgroundDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kStopNonTimersInBackground)},
 
     {"stop-in-background", flag_descriptions::kStopInBackgroundName,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 15fd287..1f4132b2 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -159,6 +159,7 @@
     &offline_pages::kOfflinePagesDescriptiveFailStatusFeature,
     &offline_pages::kOfflinePagesDescriptivePendingStatusFeature,
     &offline_pages::kOfflinePagesSharingFeature,
+    &offline_pages::kPrefetchingOfflinePagesFeature,
     &omnibox::kUIExperimentHideSteadyStateUrlSchemeAndSubdomains,
     &password_manager::features::kPasswordExport,
     &password_manager::features::kPasswordSearchMobile,
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
index 00a335fd..b471c5f 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "build/build_config.h"
 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/storage_partition.h"
@@ -18,7 +19,19 @@
 namespace {
 
 const size_t kMaxRequests = 25;  // Maximum number of inflight requests allowed.
-const int kMaxCacheEntries = 5;  // Maximum number of cache entries.
+
+// Maximum number of cache entries. This was 5 before, which worked well enough
+// for few images like weather answers, but with rich entity suggestions showing
+// several images at once, even changing some while the user types, a larger
+// cache is necessary to avoid flickering. Each cache entry is expected to take
+// 16kb (64x64 @ 32bpp), and experimentation shows 18 entries is enough to
+// eliminate flicker with the standard 6 suggestion omnibox filled with entities
+// so the maximum expected memory consumption is ~288kb per browser window.
+#if defined(OS_ANDROID)
+const int kMaxCacheEntries = 5;
+#else
+const int kMaxCacheEntries = 18;
+#endif
 
 }  // namespace.
 
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index c42b0328..7b8c34ff 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -153,6 +153,7 @@
         <if expr="optimize_webui">
           <then>
             <include name="IDR_MD_DOWNLOADS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_downloads\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+            <include name="IDR_MD_DOWNLOADS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_downloads\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
             <include name="IDR_MD_DOWNLOADS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_downloads\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
           </then>
           <else>
@@ -205,6 +206,7 @@
         <if expr="optimize_webui">
           <then>
             <include name="IDR_MD_BOOKMARKS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+            <include name="IDR_MD_BOOKMARKS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
             <include name="IDR_MD_BOOKMARKS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_bookmarks\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
           </then>
           <else>
@@ -266,8 +268,10 @@
         <if expr="optimize_webui">
           <then>
             <include name="IDR_MD_HISTORY_APP_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_history\app.vulcanized.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" use_base_dir="false" />
+            <include name="IDR_MD_HISTORY_APP_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_history\app.vulcanized.p2.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" use_base_dir="false" />
             <include name="IDR_MD_HISTORY_APP_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_history\app.crisper.js" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" use_base_dir="false" />
             <include name="IDR_MD_HISTORY_LAZY_LOAD_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_history\lazy_load.vulcanized.html" allowexternalscript="true" type="BINDATA" compress="gzip" use_base_dir="false" />
+            <include name="IDR_MD_HISTORY_LAZY_LOAD_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_history\lazy_load.vulcanized.p2.html" allowexternalscript="true" type="BINDATA" compress="gzip" use_base_dir="false" />
             <include name="IDR_MD_HISTORY_LAZY_LOAD_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_history\lazy_load.crisper.js" allowexternalscript="true" type="BINDATA" compress="gzip" use_base_dir="false" />
           </then>
           <else>
@@ -454,6 +458,7 @@
         <if expr="optimize_webui">
           <then>
             <include name="IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\bluetooth_pairing_dialog\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+            <include name="IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\bluetooth_pairing_dialog\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
             <include name="IDR_BLUETOOTH_PAIRING_DIALOG_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\bluetooth_pairing_dialog\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
           </then>
           <else>
@@ -482,8 +487,10 @@
         <if expr="optimize_webui">
           <then>
             <include name="IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_config_dialog\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+            <include name="IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_config_dialog\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
             <include name="IDR_INTERNET_CONFIG_DIALOG_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_config_dialog\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
             <include name="IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_detail_dialog\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+            <include name="IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_detail_dialog\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
             <include name="IDR_INTERNET_DETAIL_DIALOG_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_detail_dialog\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
           </then>
           <else>
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 8be2c9cf..cb1e107 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -416,9 +416,7 @@
   auto* component_manager =
       g_browser_process->platform_part()->cros_component_manager();
   return component_manager &&
-         !component_manager
-              ->GetCompatiblePath(imageloader::kTerminaComponentName)
-              .empty();
+         component_manager->IsRegistered(imageloader::kTerminaComponentName);
 }
 
 void CrostiniManager::MaybeUpgradeCrostini(Profile* profile) {
@@ -470,12 +468,30 @@
       g_browser_process->platform_part()->cros_component_manager();
   DCHECK(cros_component_manager);
 
+  bool major_update_required =
+      IsCrosTerminaInstalled() &&
+      cros_component_manager
+          ->GetCompatiblePath(imageloader::kTerminaComponentName)
+          .empty();
+  bool is_offline = net::NetworkChangeNotifier::IsOffline();
+
+  if (major_update_required) {
+    termina_update_check_needed_ = false;
+    if (is_offline) {
+      LOG(ERROR) << "Need to load a major component update, but we're offline.";
+      // TODO(nverne): Show a dialog/notification here for online upgrade
+      // required.
+      std::move(callback).Run(false);
+      return;
+    }
+  }
+
   using UpdatePolicy = component_updater::CrOSComponentManager::UpdatePolicy;
   UpdatePolicy update_policy;
-  if (termina_update_check_needed_ &&
-      !net::NetworkChangeNotifier::IsOffline()) {
+  if (termina_update_check_needed_ && !is_offline) {
     // Don't use kForce all the time because it generates traffic to
-    // ComponentUpdaterService.
+    // ComponentUpdaterService. Also, it's only appropriate for minor version
+    // updates. Not major version incompatiblility.
     update_policy = UpdatePolicy::kForce;
   } else {
     update_policy = UpdatePolicy::kDontForce;
diff --git a/chrome/browser/chromeos/login/ui/DEPS b/chrome/browser/chromeos/login/ui/DEPS
index 3485778e..a45b953 100644
--- a/chrome/browser/chromeos/login/ui/DEPS
+++ b/chrome/browser/chromeos/login/ui/DEPS
@@ -21,6 +21,7 @@
      "+ash/focus_cycler.h",
      "+ash/public/cpp/ash_features.h",
      "+ash/root_window_controller.h",
+     "+ash/shelf/shelf.h",
      "+ash/shelf/shelf_widget.h",
      "+ash/shell.h",
      "+ash/system",
diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.cc b/chrome/browser/chromeos/login/ui/webui_login_view.cc
index d09df4dd..994d94d8 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_view.cc
+++ b/chrome/browser/chromeos/login/ui/webui_login_view.cc
@@ -10,11 +10,11 @@
 #include "ash/focus_cycler.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/root_window_controller.h"
+#include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/system/status_area_widget_delegate.h"
-#include "ash/system/tray/system_tray.h"
 #include "ash/system/tray/system_tray_notifier.h"
 #include "base/bind.h"
 #include "base/callback.h"
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 2f8bf681..c04db11 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -116,7 +116,6 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/accelerators/accelerator.h"
-#include "ui/base/ui_base_features.h"
 
 using content::BrowserThread;
 
@@ -300,16 +299,12 @@
   // In session OOBE was initiated from voice interaction keyboard shortcuts.
   is_in_session_oobe_ =
       session_manager::SessionManager::Get()->IsSessionStarted();
-  if (features::IsAshInBrowserProcess()) {
-    AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
-    if (accessibility_manager) {
-      // accessibility_manager could be null in Tests.
-      accessibility_subscription_ = accessibility_manager->RegisterCallback(
-          base::Bind(&WizardController::OnAccessibilityStatusChanged,
-                     base::Unretained(this)));
-    }
-  } else {
-    NOTIMPLEMENTED();
+  AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
+  if (accessibility_manager) {
+    // accessibility_manager could be null in Tests.
+    accessibility_subscription_ = accessibility_manager->RegisterCallback(
+        base::Bind(&WizardController::OnAccessibilityStatusChanged,
+                   base::Unretained(this)));
   }
   oobe_configuration_ = OobeConfiguration::Get()->GetConfiguration().Clone();
   OobeConfiguration::Get()->AddObserver(this);
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.cc b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
index 268a0b17..04a0f8a 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
@@ -7,6 +7,7 @@
 #include <cmath>
 
 #include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/chromeos/power/ml/real_boot_clock.h"
 #include "chrome/browser/resource_coordinator/tab_metrics_logger.h"
@@ -25,6 +26,12 @@
 namespace power {
 namespace ml {
 
+namespace {
+void LogPowerMLPreviousEventLoggingResult(PreviousEventLoggingResult result) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.PreviousEventLogging.Result", result);
+}
+}  // namespace
+
 struct UserActivityManager::PreviousIdleEventData {
   // Gap between two ScreenDimImminent signals.
   base::TimeDelta dim_imminent_signal_interval;
@@ -407,9 +414,11 @@
   UserActivityEvent::Event* event = activity_event.mutable_event();
   event->set_type(type);
   event->set_reason(reason);
-  event->set_log_duration_sec(
-      (boot_clock_->GetTimeSinceBoot() - idle_event_start_since_boot_.value())
-          .InSeconds());
+  if (idle_event_start_since_boot_) {
+    event->set_log_duration_sec(
+        (boot_clock_->GetTimeSinceBoot() - idle_event_start_since_boot_.value())
+            .InSeconds());
+  }
   event->set_screen_dim_occurred(screen_dim_occurred_);
   event->set_screen_lock_occurred(screen_lock_occurred_);
   event->set_screen_off_occurred(screen_off_occurred_);
@@ -426,9 +435,12 @@
   // If there's an earlier idle event that has not received its own event, log
   // it here too.
   if (previous_idle_event_data_) {
-    event->set_log_duration_sec(
-        event->log_duration_sec() +
-        previous_idle_event_data_->dim_imminent_signal_interval.InSeconds());
+    if (event->has_log_duration_sec()) {
+      event->set_log_duration_sec(
+          event->log_duration_sec() +
+          previous_idle_event_data_->dim_imminent_signal_interval.InSeconds());
+    }
+
     *activity_event.mutable_features() = previous_idle_event_data_->features;
     *activity_event.mutable_model_prediction() =
         previous_idle_event_data_->model_prediction;
@@ -452,10 +464,33 @@
 
 void UserActivityManager::PopulatePreviousEventData(
     const base::TimeDelta& now) {
-  // Should not have been set.
-  DCHECK(!previous_idle_event_data_);
-  DCHECK(idle_event_start_since_boot_);
-  DCHECK(model_prediction_);
+  PreviousEventLoggingResult result = PreviousEventLoggingResult::kSuccess;
+  if (!model_prediction_) {
+    result = base::FeatureList::IsEnabled(features::kUserActivityPrediction) &&
+                     smart_dim_model_
+                 ? PreviousEventLoggingResult::kErrorModelPredictionMissing
+                 : PreviousEventLoggingResult::kErrorModelDisabled;
+    LogPowerMLPreviousEventLoggingResult(result);
+  }
+
+  if (previous_idle_event_data_) {
+    result = PreviousEventLoggingResult::kErrorMultiplePreviousEvents;
+    previous_idle_event_data_.reset();
+    LogPowerMLPreviousEventLoggingResult(result);
+  }
+
+  if (!idle_event_start_since_boot_) {
+    result = PreviousEventLoggingResult::kErrorIdleStartMissing;
+    LogPowerMLPreviousEventLoggingResult(result);
+  }
+
+  if (result != PreviousEventLoggingResult::kSuccess) {
+    LogPowerMLPreviousEventLoggingResult(PreviousEventLoggingResult::kError);
+    return;
+  }
+
+  // Only log if none of the errors above occurred.
+  LogPowerMLPreviousEventLoggingResult(result);
 
   previous_idle_event_data_ = std::make_unique<PreviousIdleEventData>();
   previous_idle_event_data_->dim_imminent_signal_interval =
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.h b/chrome/browser/chromeos/power/ml/user_activity_manager.h
index 90f62084..dd9c021e 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.h
@@ -34,6 +34,20 @@
 
 class BootClock;
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// The values below are not mutually exclusive. kError is any error which could
+// be any of the other kErrors.
+enum class PreviousEventLoggingResult {
+  kSuccess = 0,
+  kError = 1,
+  kErrorModelPredictionMissing = 2,
+  kErrorModelDisabled = 3,
+  kErrorMultiplePreviousEvents = 4,
+  kErrorIdleStartMissing = 5,
+  kMaxValue = kErrorIdleStartMissing
+};
+
 struct TabProperty {
   ukm::SourceId source_id = -1;
   std::string domain;
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.cc b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
index 4d586ce..94c2dfe8 100644
--- a/chrome/browser/component_updater/cros_component_installer_chromeos.cc
+++ b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
@@ -275,6 +275,14 @@
     delegate_->EmitInstalledSignal(component);
 }
 
+bool CrOSComponentManager::IsRegistered(const std::string& name) {
+  base::FilePath root;
+  if (!base::PathService::Get(DIR_COMPONENT_USER, &root))
+    return false;
+
+  return base::PathExists(root.Append(kComponentsRootPath).Append(name));
+}
+
 void CrOSComponentManager::Register(ComponentUpdateService* cus,
                                     const ComponentConfig& config,
                                     base::OnceClosure register_callback) {
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.h b/chrome/browser/component_updater/cros_component_installer_chromeos.h
index ae6f7c0..412360a 100644
--- a/chrome/browser/component_updater/cros_component_installer_chromeos.h
+++ b/chrome/browser/component_updater/cros_component_installer_chromeos.h
@@ -141,6 +141,10 @@
   // Broadcasts a D-Bus signal for a successful component installation.
   void EmitInstalledSignal(const std::string& component);
 
+  // Returns true if any previously registered version of a component exists,
+  // even if it is incompatible.
+  bool IsRegistered(const std::string& name);
+
  private:
   FRIEND_TEST_ALL_PREFIXES(CrOSComponentInstallerTest, RegisterComponent);
   FRIEND_TEST_ALL_PREFIXES(CrOSComponentInstallerTest,
diff --git a/chrome/browser/conflicts/module_info_win.h b/chrome/browser/conflicts/module_info_win.h
index 438a4843..5585fb1 100644
--- a/chrome/browser/conflicts/module_info_win.h
+++ b/chrome/browser/conflicts/module_info_win.h
@@ -15,7 +15,7 @@
 // maintain information about a module, usually in a std::map.
 
 // Used by the ModuleDatabase as a unique identifier for a module.
-using ModuleId = int;
+using ModuleId = uint32_t;
 
 // This is the constant portion of the module information, and is used to
 // uniquely identify one.
diff --git a/chrome/browser/conflicts/third_party_metrics_recorder_win.h b/chrome/browser/conflicts/third_party_metrics_recorder_win.h
index 1564b20..8200b70a5 100644
--- a/chrome/browser/conflicts/third_party_metrics_recorder_win.h
+++ b/chrome/browser/conflicts/third_party_metrics_recorder_win.h
@@ -37,7 +37,7 @@
   void AddUnsignedModuleToCrashkeys(const base::string16& module_basename);
 
   // The index of the crash key that is currently being updated.
-  int current_key_index_ = 0;
+  size_t current_key_index_ = 0;
 
   // The value of the crash key that is currently being updated.
   std::string current_value_;
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
index c6873972..efd0a38d 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
@@ -386,10 +386,14 @@
   if (!router)
     return;
 
-  router->RecordNewWebContents(web_contents(),
-                               source_render_frame_host->GetProcess()->GetID(),
-                               source_render_frame_host->GetRoutingID(), url,
-                               new_contents, renderer_initiated);
+  TabStripModel* ignored_tab_strip_model = nullptr;
+  int ignored_tab_index = -1;
+  bool new_contents_is_present_in_tabstrip = ExtensionTabUtil::GetTabStripModel(
+      new_contents, &ignored_tab_strip_model, &ignored_tab_index);
+  router->RecordNewWebContents(
+      web_contents(), source_render_frame_host->GetProcess()->GetID(),
+      source_render_frame_host->GetRoutingID(), url, new_contents,
+      !new_contents_is_present_in_tabstrip);
 }
 
 void WebNavigationTabObserver::WebContentsDestroyed() {
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc
index 00e1732..281ebd68 100644
--- a/chrome/browser/extensions/permissions_updater.cc
+++ b/chrome/browser/extensions/permissions_updater.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/feature_list.h"
 #include "base/memory/ref_counted.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/api/permissions/permissions_api_helpers.h"
@@ -21,6 +22,7 @@
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/notification_types.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/extension_features.h"
 #include "extensions/common/extension_messages.h"
 #include "extensions/common/manifest_handlers/permissions_parser.h"
 #include "extensions/common/permissions/permission_set.h"
@@ -107,24 +109,50 @@
   // we don't later disable the extension when we check the active permissions
   // against the granted set to determine if there's a permissions increase) and
   // the granted runtime permissions (so they don't get withheld with runtime
-  // host permissions enabled).
+  // host permissions enabled). They're also added to the active set, which is
+  // the permission set stored in preferences representing the extension's
+  // currently-desired permission state.
   constexpr int permissions_store_mask =
-      kGrantedPermissions | kRuntimeGrantedPermissions;
-  AddPermissionsImpl(extension, permissions, permissions_store_mask);
+      kActivePermissions | kGrantedPermissions | kRuntimeGrantedPermissions;
+  AddPermissionsImpl(extension, permissions, permissions_store_mask,
+                     permissions);
 }
 
 void PermissionsUpdater::GrantRuntimePermissions(
     const Extension& extension,
     const PermissionSet& permissions) {
+  DCHECK(base::FeatureList::IsEnabled(features::kRuntimeHostPermissions));
+
+  // We don't want to grant the extension object/process more privilege than it
+  // requested, even if the user grants additional permission. For instance, if
+  // the extension requests https://maps.google.com and the user grants
+  // https://*.google.com, we only want to grant the extension itself
+  // https://maps.google.com. Since we updated the prefs with the exact
+  // granted permissions (*.google.com), if the extension later requests
+  // increased permissions that are already covered, they will be auto-granted.
+
+  // Determine which permissions to add to the extension.
+  const PermissionSet& withheld =
+      extension.permissions_data()->withheld_permissions();
+
+  // We add the intersection of any permissions that were withheld and the
+  // permissions that were granted. Since these might not be directly
+  // overlapping, we need to use a detailed intersection behavior here.
+  std::unique_ptr<const PermissionSet> active_permissions_to_add =
+      PermissionSet::CreateIntersection(
+          withheld, permissions,
+          URLPatternSet::IntersectionBehavior::kDetailed);
   CHECK(extension.permissions_data()->withheld_permissions().Contains(
-      permissions))
+      *active_permissions_to_add))
       << "Cannot add runtime granted permissions that were not withheld.";
 
   // Adding runtime granted permissions does not add permissions to the
-  // granted permissions store, so that behavior taken with the runtime host
-  // permissions feature is confined to when the experiment is enabled.
+  // granted or active permissions store, so that behavior taken with the
+  // runtime host permissions feature is confined to when the experiment is
+  // enabled.
   constexpr int permissions_store_mask = kRuntimeGrantedPermissions;
-  AddPermissionsImpl(extension, permissions, permissions_store_mask);
+  AddPermissionsImpl(extension, *active_permissions_to_add,
+                     permissions_store_mask, permissions);
 }
 
 void PermissionsUpdater::RevokeOptionalPermissions(
@@ -140,25 +168,68 @@
 
   // Revoked optional permissions are removed from granted and runtime-granted
   // permissions only if the user, and not the extension, removed them. This
-  // allows the extension to add them again without prompting the user.
-  int permissions_store_mask = kNone;
+  // allows the extension to add them again without prompting the user. They are
+  // always removed from the active set, which is the set of permissions the
+  // the extension currently requests.
+  int permissions_store_mask = kActivePermissions;
   if (remove_type == REMOVE_HARD)
-    permissions_store_mask = kGrantedPermissions | kRuntimeGrantedPermissions;
-  RemovePermissionsImpl(extension, permissions, permissions_store_mask);
+    permissions_store_mask |= kGrantedPermissions | kRuntimeGrantedPermissions;
+
+  RemovePermissionsImpl(extension, permissions, permissions_store_mask,
+                        permissions);
 }
 
 void PermissionsUpdater::RevokeRuntimePermissions(
     const Extension& extension,
     const PermissionSet& permissions) {
+  DCHECK(base::FeatureList::IsEnabled(features::kRuntimeHostPermissions));
+  // Similar to the process in adding permissions, we might be revoking more
+  // permissions than the extension currently has explicit access to. For
+  // instance, we might be revoking https://*.google.com/* even if the extension
+  // only has https://maps.google.com/*.
+  const PermissionSet& active =
+      extension.permissions_data()->active_permissions();
+  // Unlike adding permissions, we should know that any permissions we remove
+  // are a superset of the permissions the extension has active (because we only
+  // allow removal origins and the extension can't have a broader origin than
+  // what it has granted).
+  std::unique_ptr<const PermissionSet> active_permissions_to_remove =
+      PermissionSet::CreateIntersection(
+          active, permissions,
+          URLPatternSet::IntersectionBehavior::kPatternsContainedByBoth);
+  // One exception: If we're revoking a permission like "<all_urls>", we need
+  // to make sure it doesn't revoke the included chrome://favicon permission.
+  std::set<URLPattern> removable_explicit_hosts;
+  bool needs_adjustment = false;
+  for (const auto& pattern : active_permissions_to_remove->explicit_hosts()) {
+    if (pattern.host() == "favicon" && pattern.scheme() == "chrome")
+      needs_adjustment = true;
+    else
+      removable_explicit_hosts.insert(pattern);
+  }
+  if (needs_adjustment) {
+    // Tedious, because PermissionSets are const. :(
+    active_permissions_to_remove = std::make_unique<PermissionSet>(
+        active_permissions_to_remove->apis(),
+        active_permissions_to_remove->manifest_permissions(),
+        URLPatternSet(removable_explicit_hosts),
+        active_permissions_to_remove->scriptable_hosts());
+  }
+
+  CHECK(extension.permissions_data()->active_permissions().Contains(
+      *active_permissions_to_remove))
+      << "Cannot remove permissions that are not active.";
   CHECK(GetRevokablePermissions(&extension)->Contains(permissions))
       << "Cannot remove non-revokable permissions.";
 
   // Removing runtime-granted permissions does not remove permissions from
   // the granted permissions store. This is done to ensure behavior taken with
   // the runtime host permissions feature is confined to when the experiment is
-  // enabled.
+  // enabled. Similarly, since the runtime-granted permissions were never added
+  // to the active permissions stored in prefs, they are also not removed.
   constexpr int permissions_store_mask = kRuntimeGrantedPermissions;
-  RemovePermissionsImpl(extension, permissions, permissions_store_mask);
+  RemovePermissionsImpl(extension, *active_permissions_to_remove,
+                        permissions_store_mask, permissions);
 }
 
 void PermissionsUpdater::SetPolicyHostRestrictions(
@@ -205,7 +276,12 @@
   std::unique_ptr<const PermissionSet> successfully_removed =
       PermissionSet::CreateDifference(active, *total);
 
-  SetPermissions(extension, std::move(total), nullptr);
+  // TODO(devlin): This seems wrong. Since these permissions are being removed
+  // by enterprise policy, we should not update the active permissions set in
+  // preferences. That way, if the enterprise policy is changed, the removed
+  // permissions would be re-added.
+  constexpr bool update_active_prefs = true;
+  SetPermissions(extension, std::move(total), update_active_prefs);
   NotifyPermissionsUpdated(REMOVED, extension, *successfully_removed);
 }
 
@@ -257,15 +333,15 @@
   }
 
   std::unique_ptr<const PermissionSet> granted_permissions;
-  std::unique_ptr<const PermissionSet> withheld_permissions;
   ScriptingPermissionsModifier::WithholdPermissionsIfNecessary(
-      *extension, *prefs, *bounded_active, &granted_permissions,
-      &withheld_permissions);
+      *extension, *prefs, *bounded_active, &granted_permissions);
 
   if (g_delegate)
     g_delegate->InitializePermissions(extension, &granted_permissions);
 
+  bool update_active_permissions = false;
   if ((init_flag_ & INIT_FLAG_TRANSIENT) == 0) {
+    update_active_permissions = true;
     // Apply per-extension policy if set.
     ExtensionManagement* management =
         ExtensionManagementFactory::GetForBrowserContext(browser_context_);
@@ -277,31 +353,48 @@
   }
 
   SetPermissions(extension, std::move(granted_permissions),
-                 std::move(withheld_permissions));
+                 update_active_permissions);
 }
 
 void PermissionsUpdater::AddPermissionsForTesting(
     const Extension& extension,
     const PermissionSet& permissions) {
-  AddPermissionsImpl(extension, permissions, kNone);
+  AddPermissionsImpl(extension, permissions, kNone, permissions);
 }
 
 void PermissionsUpdater::SetPermissions(
     const Extension* extension,
-    std::unique_ptr<const PermissionSet> active,
-    std::unique_ptr<const PermissionSet> withheld) {
-  DCHECK(active);
-  const PermissionSet& active_weak = *active;
-  if (withheld) {
-    extension->permissions_data()->SetPermissions(std::move(active),
-                                                  std::move(withheld));
-  } else {
-    extension->permissions_data()->SetActivePermissions(std::move(active));
-  }
+    std::unique_ptr<const PermissionSet> new_active,
+    bool update_prefs) {
+  // Calculate the withheld permissions as any permissions that were required,
+  // but are not in the active set.
+  const PermissionSet& required =
+      PermissionsParser::GetRequiredPermissions(extension);
+  // TODO(https://crbug.com/869403): Currently, withheld permissions should only
+  // contain permissions withheld by the runtime host permissions feature.
+  // However, there could possibly be API permissions that were removed from the
+  // active set by enterprise policy. These shouldn't go in the withheld
+  // permission set, since withheld permissions are generally supposed to be
+  // grantable. Currently, we can deal with this because all permissions
+  // withheld by runtime host permissions are explicit or scriptable hosts, and
+  // all permissions blocked by enterprise are API permissions. So to get the
+  // set of runtime-hosts-withheld permissions, we just look at the delta in the
+  // URLPatternSets. However, this is very fragile, and should be dealt with
+  // more robustly.
+  std::unique_ptr<const PermissionSet> new_withheld =
+      PermissionSet::CreateDifference(
+          PermissionSet(APIPermissionSet(), ManifestPermissionSet(),
+                        required.explicit_hosts(), required.scriptable_hosts()),
+          *new_active);
 
-  if ((init_flag_ & INIT_FLAG_TRANSIENT) == 0) {
+  extension->permissions_data()->SetPermissions(std::move(new_active),
+                                                std::move(new_withheld));
+
+  if (update_prefs) {
     ExtensionPrefs::Get(browser_context_)
-        ->SetActivePermissions(extension->id(), active_weak);
+        ->SetActivePermissions(
+            extension->id(),
+            extension->permissions_data()->active_permissions());
   }
 }
 
@@ -414,20 +507,17 @@
   }
 }
 
-void PermissionsUpdater::AddPermissionsImpl(const Extension& extension,
-                                            const PermissionSet& permissions,
-                                            int permissions_store_mask) {
-  const PermissionSet& active =
-      extension.permissions_data()->active_permissions();
-  std::unique_ptr<const PermissionSet> total =
-      PermissionSet::CreateUnion(active, permissions);
-  std::unique_ptr<const PermissionSet> added =
-      PermissionSet::CreateDifference(*total, active);
+void PermissionsUpdater::AddPermissionsImpl(
+    const Extension& extension,
+    const PermissionSet& active_permissions_to_add,
+    int permissions_store_mask,
+    const PermissionSet& prefs_permissions_to_add) {
+  std::unique_ptr<const PermissionSet> new_active = PermissionSet::CreateUnion(
+      active_permissions_to_add,
+      extension.permissions_data()->active_permissions());
 
-  std::unique_ptr<const PermissionSet> new_withheld =
-      PermissionSet::CreateDifference(
-          extension.permissions_data()->withheld_permissions(), permissions);
-  SetPermissions(&extension, std::move(total), std::move(new_withheld));
+  bool update_active_prefs = (permissions_store_mask & kActivePermissions) != 0;
+  SetPermissions(&extension, std::move(new_active), update_active_prefs);
 
   if ((permissions_store_mask & kGrantedPermissions) != 0) {
     // TODO(devlin): Could we only grant |permissions|, rather than all those
@@ -438,44 +528,40 @@
 
   if ((permissions_store_mask & kRuntimeGrantedPermissions) != 0) {
     ExtensionPrefs::Get(browser_context_)
-        ->AddRuntimeGrantedPermissions(extension.id(), permissions);
+        ->AddRuntimeGrantedPermissions(extension.id(),
+                                       prefs_permissions_to_add);
   }
 
-  NotifyPermissionsUpdated(ADDED, &extension, *added);
+  NotifyPermissionsUpdated(ADDED, &extension, active_permissions_to_add);
 }
 
-void PermissionsUpdater::RemovePermissionsImpl(const Extension& extension,
-                                               const PermissionSet& to_remove,
-                                               int permissions_store_mask) {
-  const PermissionSet& active =
-      extension.permissions_data()->active_permissions();
-  std::unique_ptr<const PermissionSet> remaining =
-      PermissionSet::CreateDifference(active, to_remove);
-
-  // Move any granted permissions that were in the withheld set back to the
-  // withheld set so they can be added back later.
-  // Any revoked permission that isn't from the optional permissions can only
-  // be a withheld permission.
-  // TODO(devlin): This won't work well when an extension specifies a permission
-  // as both optional and required.
-  std::unique_ptr<const PermissionSet> removed_withheld =
+void PermissionsUpdater::RemovePermissionsImpl(
+    const Extension& extension,
+    const PermissionSet& active_permissions_to_remove,
+    int permissions_store_mask,
+    const PermissionSet& prefs_permissions_to_remove) {
+  std::unique_ptr<const PermissionSet> new_active =
       PermissionSet::CreateDifference(
-          to_remove, PermissionsParser::GetOptionalPermissions(&extension));
-  std::unique_ptr<const PermissionSet> withheld = PermissionSet::CreateUnion(
-      *removed_withheld, extension.permissions_data()->withheld_permissions());
+          extension.permissions_data()->active_permissions(),
+          active_permissions_to_remove);
 
-  SetPermissions(&extension, std::move(remaining), std::move(withheld));
+  bool update_active_prefs = (permissions_store_mask & kActivePermissions) != 0;
+  SetPermissions(&extension, std::move(new_active), update_active_prefs);
 
   ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context_);
   // NOTE: Currently, this code path is only reached in unit tests. See comment
   // above REMOVE_HARD in the header file.
-  if ((permissions_store_mask & kGrantedPermissions) != 0)
-    prefs->RemoveGrantedPermissions(extension.id(), to_remove);
+  if ((permissions_store_mask & kGrantedPermissions) != 0) {
+    prefs->RemoveGrantedPermissions(extension.id(),
+                                    prefs_permissions_to_remove);
+  }
 
-  if ((permissions_store_mask & kRuntimeGrantedPermissions) != 0)
-    prefs->RemoveRuntimeGrantedPermissions(extension.id(), to_remove);
+  if ((permissions_store_mask & kRuntimeGrantedPermissions) != 0) {
+    prefs->RemoveRuntimeGrantedPermissions(extension.id(),
+                                           prefs_permissions_to_remove);
+  }
 
-  NotifyPermissionsUpdated(REMOVED, &extension, to_remove);
+  NotifyPermissionsUpdated(REMOVED, &extension, active_permissions_to_remove);
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/permissions_updater.h b/chrome/browser/extensions/permissions_updater.h
index 765599644..8bbeca4 100644
--- a/chrome/browser/extensions/permissions_updater.h
+++ b/chrome/browser/extensions/permissions_updater.h
@@ -78,7 +78,10 @@
 
   // Grants |permissions| that were withheld at installation and granted at
   // runtime to |extension|, updating the active permission set and notifying
-  // any observers.
+  // any observers. |permissions| may contain permissions that were not
+  // explicitly requested by the extension; if this happens, those permissions
+  // will be added to the runtime-granted permissions in the preferences, but
+  // will not be granted to the extension object or process itself.
   // NOTE: This should only be used for granting permissions through the runtime
   // host permissions feature.
   void GrantRuntimePermissions(const Extension& extension,
@@ -156,15 +159,15 @@
     kNone = 0,
     kGrantedPermissions = 1 << 0,
     kRuntimeGrantedPermissions = 1 << 1,
+    kActivePermissions = 1 << 2,
   };
 
-  // Sets the |extension|'s active permissions to |active| and records the
-  // change in the prefs. If |withheld| is non-null, also sets the extension's
-  // withheld permissions to |withheld|. Otherwise, |withheld| permissions are
-  // not changed.
+  // Sets the |extension|'s active permissions to |active|, and calculates and
+  // sets the |extension|'s new withheld permissions. If |update_prefs| is true,
+  // also updates the set of active permissions in the extension preferences.
   void SetPermissions(const Extension* extension,
                       std::unique_ptr<const PermissionSet> active,
-                      std::unique_ptr<const PermissionSet> withheld);
+                      bool update_prefs);
 
   // Dispatches specified event to the extension.
   void DispatchEvent(const std::string& extension_id,
@@ -189,17 +192,26 @@
       const URLPatternSet& default_runtime_blocked_hosts,
       const URLPatternSet& default_runtime_allowed_hosts);
 
-  // Adds the given |permissions| to |extension|. Updates the preferences
-  // according to |permission_store_mask|.
+  // Adds the given |active_permissions_to_add| to |extension|'s current
+  // active permissions (i.e., the permissions associated with the |extension|
+  // object and the extension's process). Updates the preferences according to
+  // |permission_store_mask| with |prefs_permissions_to_add|.
+  // The sets of |prefs_permissions_to_add| and |active_permissions_to_add| may
+  // differ in the case of granting a wider set of permissions than what the
+  // extension explicitly requested, as described in GrantRuntimePermissions().
   void AddPermissionsImpl(const Extension& extension,
-                          const PermissionSet& permissions,
-                          int permission_store_mask);
+                          const PermissionSet& active_permissions_to_add,
+                          int permission_store_mask,
+                          const PermissionSet& prefs_permissions_to_add);
 
-  // Removes the given |permissions| to |extension|. Updates the preferences
-  // according to |permission_store_mask|.
+  // Removes the given |active_permissions_to_remove| from |extension|'s current
+  // active permissions. Updates the preferences according to
+  // |permission_store_mask| with |prefs_permissions_to_remove|. As above, the
+  // permission sets may be different.
   void RemovePermissionsImpl(const Extension& extension,
-                             const PermissionSet& permissions,
-                             int permission_store_mask);
+                             const PermissionSet& active_permissions_to_remove,
+                             int permission_store_mask,
+                             const PermissionSet& prefs_permissions_to_remove);
 
   // The associated BrowserContext.
   content::BrowserContext* browser_context_;
diff --git a/chrome/browser/extensions/permissions_updater_unittest.cc b/chrome/browser/extensions/permissions_updater_unittest.cc
index 07036db..bc31ee3 100644
--- a/chrome/browser/extensions/permissions_updater_unittest.cc
+++ b/chrome/browser/extensions/permissions_updater_unittest.cc
@@ -732,4 +732,116 @@
   }
 }
 
+// Tests runtime-granting permissions beyond what are explicitly requested by
+// the extension.
+TEST_F(PermissionsUpdaterTest, GrantingBroadRuntimePermissions) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions);
+  InitializeEmptyExtensionService();
+
+  scoped_refptr<const Extension> extension =
+      ExtensionBuilder("extension")
+          .AddPermission("https://maps.google.com/*")
+          .Build();
+
+  const URLPattern kMapsPattern(Extension::kValidHostPermissionSchemes,
+                                "https://maps.google.com/*");
+  const URLPattern kAllGooglePattern(Extension::kValidHostPermissionSchemes,
+                                     "https://*.google.com/*");
+
+  // Withhold host permissions. Effective hosts should be empty.
+  PermissionsUpdater updater(profile());
+  updater.InitializePermissions(extension.get());
+  ScriptingPermissionsModifier(profile(), extension)
+      .SetWithholdHostPermissions(true);
+  EXPECT_TRUE(extension->permissions_data()
+                  ->active_permissions()
+                  .effective_hosts()
+                  .is_empty());
+
+  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+
+  {
+    // Verify initial state. The extension "active" permissions in preferences
+    // represent the permissions that would be active on the extension without
+    // the runtime host permissions feature. Thus, this should include the
+    // requested host permissions, and nothing more.
+    std::unique_ptr<const PermissionSet> active_prefs =
+        prefs->GetActivePermissions(extension->id());
+    EXPECT_TRUE(active_prefs->effective_hosts().ContainsPattern(kMapsPattern));
+    EXPECT_FALSE(
+        active_prefs->effective_hosts().ContainsPattern(kAllGooglePattern));
+
+    // Runtime granted permissions should not contain any permissions (all
+    // hosts are withheld).
+    std::unique_ptr<const PermissionSet> runtime_granted_prefs =
+        prefs->GetRuntimeGrantedPermissions(extension->id());
+    EXPECT_FALSE(
+        runtime_granted_prefs->effective_hosts().ContainsPattern(kMapsPattern));
+    EXPECT_FALSE(runtime_granted_prefs->effective_hosts().ContainsPattern(
+        kAllGooglePattern));
+  }
+
+  // Grant permission to all google.com domains.
+  const PermissionSet runtime_permissions(
+      APIPermissionSet(), ManifestPermissionSet(),
+      URLPatternSet({kAllGooglePattern}), URLPatternSet());
+  updater.GrantRuntimePermissions(*extension, runtime_permissions);
+
+  // The extension object's permission should never include un-requested
+  // permissions, so it should only include maps.google.com.
+  EXPECT_TRUE(extension->permissions_data()
+                  ->active_permissions()
+                  .effective_hosts()
+                  .ContainsPattern(kMapsPattern));
+  EXPECT_FALSE(extension->permissions_data()
+                   ->active_permissions()
+                   .effective_hosts()
+                   .ContainsPattern(kAllGooglePattern));
+
+  {
+    // The active permissions in preferences should reflect the extension's
+    // permission state without the runtime host permissions feature, so should
+    // still include exactly the requested permissions.
+    std::unique_ptr<const PermissionSet> active_prefs =
+        prefs->GetActivePermissions(extension->id());
+    EXPECT_TRUE(active_prefs->effective_hosts().ContainsPattern(kMapsPattern));
+    EXPECT_FALSE(
+        active_prefs->effective_hosts().ContainsPattern(kAllGooglePattern));
+    // The runtime-granted permissions should include all permissions that have
+    // been granted, which in this case includes google.com subdomains.
+    std::unique_ptr<const PermissionSet> runtime_granted_prefs =
+        prefs->GetRuntimeGrantedPermissions(extension->id());
+    EXPECT_TRUE(
+        runtime_granted_prefs->effective_hosts().ContainsPattern(kMapsPattern));
+    EXPECT_TRUE(runtime_granted_prefs->effective_hosts().ContainsPattern(
+        kAllGooglePattern));
+  }
+
+  // Revoke the host permission.
+  updater.RevokeRuntimePermissions(*extension, runtime_permissions);
+
+  EXPECT_FALSE(extension->permissions_data()
+                   ->active_permissions()
+                   .effective_hosts()
+                   .ContainsPattern(kMapsPattern));
+
+  {
+    // Active permissions in the preferences should remain constant (unaffected
+    // by the runtime host permissions feature).
+    std::unique_ptr<const PermissionSet> active_prefs =
+        prefs->GetActivePermissions(extension->id());
+    EXPECT_TRUE(active_prefs->effective_hosts().ContainsPattern(kMapsPattern));
+    EXPECT_FALSE(
+        active_prefs->effective_hosts().ContainsPattern(kAllGooglePattern));
+    // The runtime granted preferences should be empty again.
+    std::unique_ptr<const PermissionSet> runtime_granted_prefs =
+        prefs->GetRuntimeGrantedPermissions(extension->id());
+    EXPECT_FALSE(
+        runtime_granted_prefs->effective_hosts().ContainsPattern(kMapsPattern));
+    EXPECT_FALSE(runtime_granted_prefs->effective_hosts().ContainsPattern(
+        kAllGooglePattern));
+  }
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc
index 119676c..594d718 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier.cc
+++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -41,21 +41,25 @@
                                                       extension.location());
 }
 
-// Partitions |requested_permissions| into two sets of permissions, granted and
-// withheld. Granted permissions are added to |granted_permissions_out|, and
-// consist of any non-host permissions or host permissions that are present in
-// |runtime_granted_permissions|. Withheld permissions are added to
-// |withheld_permissions_out|, and are any host permissions that are not in
-// |granted_runtime_permissions|.
-void PartitionPermissions(
+// Iterates over |requested_permissions| and adds any permissions that should
+// be granted to |granted_permissions_out|. These include any non-host
+// permissions or host permissions that are present in
+// |runtime_granted_permissions|. |granted_permissions_out| may contain new
+// patterns not found in either |requested_permissions| or
+// |runtime_granted_permissions| in the case of overlapping host permissions
+// (such as *://*.google.com/* and https://*/*, which would intersect with
+// https://*.google.com/*).
+void PartitionHostPermissions(
     const PermissionSet& requested_permissions,
     const PermissionSet& runtime_granted_permissions,
-    std::unique_ptr<const PermissionSet>* granted_permissions_out,
-    std::unique_ptr<const PermissionSet>* withheld_permissions_out) {
+    std::unique_ptr<const PermissionSet>* granted_permissions_out) {
   auto segregate_url_permissions =
       [](const URLPatternSet& requested_patterns,
-         const URLPatternSet& runtime_granted_patterns, URLPatternSet* granted,
-         URLPatternSet* withheld) {
+         const URLPatternSet& runtime_granted_patterns,
+         URLPatternSet* granted) {
+        *granted = URLPatternSet::CreateIntersection(
+            requested_patterns, runtime_granted_patterns,
+            URLPatternSet::IntersectionBehavior::kDetailed);
         for (const URLPattern& pattern : requested_patterns) {
           // The chrome://favicon permission is special. It is requested by
           // extensions to access stored favicons, but is not a traditional
@@ -65,34 +69,24 @@
           // permission.
           bool is_chrome_favicon =
               pattern.host() == "favicon" && pattern.scheme() == "chrome";
-          bool is_runtime_granted =
-              runtime_granted_patterns.ContainsPattern(pattern);
-          if (is_chrome_favicon || is_runtime_granted)
+          if (is_chrome_favicon)
             granted->AddPattern(pattern);
-          else
-            withheld->AddPattern(pattern);
         }
       };
 
   URLPatternSet granted_explicit_hosts;
-  URLPatternSet withheld_explicit_hosts;
   URLPatternSet granted_scriptable_hosts;
-  URLPatternSet withheld_scriptable_hosts;
   segregate_url_permissions(requested_permissions.explicit_hosts(),
                             runtime_granted_permissions.explicit_hosts(),
-                            &granted_explicit_hosts, &withheld_explicit_hosts);
+                            &granted_explicit_hosts);
   segregate_url_permissions(requested_permissions.scriptable_hosts(),
                             runtime_granted_permissions.scriptable_hosts(),
-                            &granted_scriptable_hosts,
-                            &withheld_scriptable_hosts);
+                            &granted_scriptable_hosts);
 
   *granted_permissions_out = std::make_unique<PermissionSet>(
       requested_permissions.apis(),
       requested_permissions.manifest_permissions(), granted_explicit_hosts,
       granted_scriptable_hosts);
-  *withheld_permissions_out = std::make_unique<PermissionSet>(
-      APIPermissionSet(), ManifestPermissionSet(), withheld_explicit_hosts,
-      withheld_scriptable_hosts);
 }
 
 // Returns true if the extension should even be considered for being affected
@@ -155,13 +149,13 @@
   if (HasWithheldHostPermissions() == should_withhold)
     return;
 
-  SetWithholdPermissionsPrefValue(extension_prefs_, extension_->id(),
-                                  should_withhold);
-
   if (should_withhold)
     WithholdHostPermissions();
   else
     GrantWithheldHostPermissions();
+
+  SetWithholdPermissionsPrefValue(extension_prefs_, extension_->id(),
+                                  should_withhold);
 }
 
 bool ScriptingPermissionsModifier::HasWithheldHostPermissions() const {
@@ -195,25 +189,16 @@
 void ScriptingPermissionsModifier::GrantHostPermission(const GURL& url) {
   DCHECK(CanAffectExtension());
 
-  GURL origin = url.GetOrigin();
-  URLPatternSet new_explicit_hosts;
-  URLPatternSet new_scriptable_hosts;
-
-  const PermissionSet& withheld_permissions =
-      extension_->permissions_data()->withheld_permissions();
-  if (withheld_permissions.explicit_hosts().MatchesURL(url)) {
-    new_explicit_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), origin);
-  }
-  if (withheld_permissions.scriptable_hosts().MatchesURL(url)) {
-    new_scriptable_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(),
-                                   origin);
-  }
+  URLPatternSet explicit_hosts;
+  explicit_hosts.AddOrigin(Extension::kValidHostPermissionSchemes, url);
+  URLPatternSet scriptable_hosts;
+  scriptable_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), url);
 
   PermissionsUpdater(browser_context_)
       .GrantRuntimePermissions(
           *extension_,
           PermissionSet(APIPermissionSet(), ManifestPermissionSet(),
-                        new_explicit_hosts, new_scriptable_hosts));
+                        explicit_hosts, scriptable_hosts));
 }
 
 bool ScriptingPermissionsModifier::HasGrantedHostPermission(
@@ -231,19 +216,10 @@
   DCHECK(CanAffectExtension());
   DCHECK(HasGrantedHostPermission(url));
 
-  GURL origin = url.GetOrigin();
   URLPatternSet explicit_hosts;
+  explicit_hosts.AddOrigin(Extension::kValidHostPermissionSchemes, url);
   URLPatternSet scriptable_hosts;
-  const PermissionSet& active_permissions =
-      extension_->permissions_data()->active_permissions();
-
-  // We know the host permission was granted, but it may only be requested in
-  // either explicit or scriptable hosts. Only remove it if it is already
-  // present.
-  if (active_permissions.explicit_hosts().MatchesURL(url))
-    explicit_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), origin);
-  if (active_permissions.scriptable_hosts().MatchesURL(url))
-    scriptable_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), origin);
+  scriptable_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), url);
 
   PermissionsUpdater(browser_context_)
       .RevokeRuntimePermissions(
@@ -254,15 +230,7 @@
 
 void ScriptingPermissionsModifier::RemoveAllGrantedHostPermissions() {
   DCHECK(CanAffectExtension());
-
-  std::unique_ptr<const PermissionSet> granted =
-      extension_prefs_->GetRuntimeGrantedPermissions(extension_->id());
-  PermissionsUpdater(browser_context_)
-      .RevokeRuntimePermissions(
-          *extension_,
-          PermissionSet(APIPermissionSet(), ManifestPermissionSet(),
-                        granted->explicit_hosts(),
-                        granted->scriptable_hosts()));
+  WithholdHostPermissions();
 }
 
 // static
@@ -270,8 +238,7 @@
     const Extension& extension,
     const ExtensionPrefs& extension_prefs,
     const PermissionSet& permissions,
-    std::unique_ptr<const PermissionSet>* granted_permissions_out,
-    std::unique_ptr<const PermissionSet>* withheld_permissions_out) {
+    std::unique_ptr<const PermissionSet>* granted_permissions_out) {
   bool should_withhold = false;
   if (ShouldConsiderExtension(extension)) {
     base::Optional<bool> pref_value =
@@ -282,7 +249,6 @@
   should_withhold &= !permissions.effective_hosts().is_empty();
   if (!should_withhold) {
     *granted_permissions_out = permissions.Clone();
-    withheld_permissions_out->reset(new PermissionSet());
     return;
   }
 
@@ -291,8 +257,8 @@
   // permissions API.
   std::unique_ptr<const PermissionSet> runtime_granted_permissions =
       extension_prefs.GetRuntimeGrantedPermissions(extension.id());
-  PartitionPermissions(permissions, *runtime_granted_permissions,
-                       granted_permissions_out, withheld_permissions_out);
+  PartitionHostPermissions(permissions, *runtime_granted_permissions,
+                           granted_permissions_out);
 }
 
 std::unique_ptr<const PermissionSet>
@@ -301,17 +267,37 @@
   if (!ShouldConsiderExtension(*extension_))
     return nullptr;
 
-  std::unique_ptr<const PermissionSet> granted_permissions;
-  std::unique_ptr<const PermissionSet> withheld_permissions;
+  // If we aren't withholding host permissions, then there may be some
+  // permissions active on the extension that should be revokable. Otherwise,
+  // all granted permissions should be stored in the preferences (and these
+  // can be a superset of permissions on the extension, as in the case of e.g.
+  // granting origins when only a subset is requested by the extension).
+  // TODO(devlin): This is confusing and subtle. We should instead perhaps just
+  // add all requested hosts as runtime-granted hosts if we aren't withholding
+  // host permissions.
+  const PermissionSet* current_granted_permissions = nullptr;
+  std::unique_ptr<const PermissionSet> runtime_granted_permissions =
+      extension_prefs_->GetRuntimeGrantedPermissions(extension_->id());
+  std::unique_ptr<const PermissionSet> union_set;
+  if (runtime_granted_permissions) {
+    union_set = PermissionSet::CreateUnion(
+        *runtime_granted_permissions,
+        extension_->permissions_data()->active_permissions());
+    current_granted_permissions = union_set.get();
+  } else {
+    current_granted_permissions =
+        &extension_->permissions_data()->active_permissions();
+  }
 
   // Revokable permissions are those that would be withheld if there were no
   // runtime-granted permissions.
   PermissionSet empty_runtime_granted_permissions;
-  PartitionPermissions(extension_->permissions_data()->active_permissions(),
-                       empty_runtime_granted_permissions, &granted_permissions,
-                       &withheld_permissions);
-
-  return withheld_permissions;
+  std::unique_ptr<const PermissionSet> granted_permissions;
+  PartitionHostPermissions(*current_granted_permissions,
+                           empty_runtime_granted_permissions,
+                           &granted_permissions);
+  return PermissionSet::CreateDifference(*current_granted_permissions,
+                                         *granted_permissions);
 }
 
 void ScriptingPermissionsModifier::GrantWithheldHostPermissions() {
@@ -326,10 +312,6 @@
 }
 
 void ScriptingPermissionsModifier::WithholdHostPermissions() {
-  // TODO(devlin): By using PermissionsUpdater::REMOVE_HARD, this will also
-  // affect granted_permissions in preferences. It shouldn't. We should
-  // introduce another enum to PermissionsModifier for removing only from
-  // runtime granted permissions.
   PermissionsUpdater(browser_context_)
       .RevokeRuntimePermissions(*extension_, *GetRevokablePermissions());
 }
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.h b/chrome/browser/extensions/scripting_permissions_modifier.h
index 3fd380e..22e28ec2 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier.h
+++ b/chrome/browser/extensions/scripting_permissions_modifier.h
@@ -74,17 +74,15 @@
 
   // Takes in a set of permissions and withholds any permissions that should not
   // be granted for the given |extension|, populating |granted_permissions_out|
-  // with the set of all permissions that can be granted, and
-  // |withheld_permissions_out| with the set of all withheld permissions. Note:
-  // we pass in |permissions| explicitly here, as this is used during permission
-  // initialization, where the active permissions on the extension may not be
-  // the permissions to compare against.
+  // with the set of all permissions that can be granted.
+  // Note: we pass in |permissions| explicitly here, as this is used during
+  // permission initialization, where the active permissions on the extension
+  // may not be the permissions to compare against.
   static void WithholdPermissionsIfNecessary(
       const Extension& extension,
       const ExtensionPrefs& extension_prefs,
       const PermissionSet& permissions,
-      std::unique_ptr<const PermissionSet>* granted_permissions_out,
-      std::unique_ptr<const PermissionSet>* withheld_permissions_out);
+      std::unique_ptr<const PermissionSet>* granted_permissions_out);
 
   // Returns the subset of active permissions which can be withheld.
   std::unique_ptr<const PermissionSet> GetRevokablePermissions() const;
diff --git a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
index 8e68f6e..4dbf9f1 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
+++ b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
@@ -512,4 +512,57 @@
   EXPECT_THAT(GetEffectivePatternsAsStrings(*extension), testing::IsEmpty());
 }
 
+// Tests granting runtime permissions for a full host when the extension only
+// wants to run on a subset of that host.
+TEST_F(ScriptingPermissionsModifierUnitTest,
+       GrantingHostPermissionsBeyondRequested) {
+  RuntimeHostPermissionsEnabledScope enabled_scope;
+  InitializeEmptyExtensionService();
+
+  DictionaryBuilder content_script;
+  content_script
+      .Set("matches", ListBuilder().Append("https://google.com/maps").Build())
+      .Set("js", ListBuilder().Append("foo.js").Build());
+  scoped_refptr<const Extension> extension =
+      ExtensionBuilder("test")
+          .SetManifestKey("content_scripts",
+                          ListBuilder().Append(content_script.Build()).Build())
+          .Build();
+
+  // At installation, all permissions granted.
+  ScriptingPermissionsModifier modifier(profile(), extension);
+  EXPECT_THAT(GetEffectivePatternsAsStrings(*extension),
+              testing::UnorderedElementsAre("https://google.com/maps"));
+
+  // Withhold host permissions.
+  modifier.SetWithholdHostPermissions(true);
+  EXPECT_THAT(GetEffectivePatternsAsStrings(*extension), testing::IsEmpty());
+
+  // Grant the requested host permission. We grant origins (rather than just
+  // paths), but we don't over-grant permissions to the actual extension object.
+  // The active permissions on the extension should be restricted to the
+  // permissions explicitly requested (google.com/maps), but the granted
+  // permissions in preferences will be the full host (google.com).
+  modifier.GrantHostPermission(GURL("https://google.com/maps"));
+  EXPECT_THAT(GetEffectivePatternsAsStrings(*extension),
+              testing::UnorderedElementsAre("https://google.com/maps"));
+  EXPECT_THAT(GetPatternsAsStrings(
+                  modifier.GetRevokablePermissions()->effective_hosts()),
+              // Subtle: revokable permissions include permissions either in
+              // the runtime granted permissions preference or active on the
+              // extension object. In this case, that includes both google.com/*
+              // and google.com/maps.
+              testing::UnorderedElementsAre("https://google.com/maps",
+                                            "https://google.com/*"));
+
+  // Remove the granted permission. This should remove the permission from both
+  // the active permissions on the extension object and the entry in the
+  // preferences.
+  modifier.RemoveAllGrantedHostPermissions();
+  EXPECT_THAT(GetEffectivePatternsAsStrings(*extension), testing::IsEmpty());
+  EXPECT_THAT(GetPatternsAsStrings(
+                  modifier.GetRevokablePermissions()->effective_hosts()),
+              testing::IsEmpty());
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc
index e1968ce..f99fc69e 100644
--- a/chrome/browser/media/encrypted_media_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -453,8 +453,7 @@
   void TestPolicyCheck() {
 // TODO(crbug.com/847591): ChromeOS Widevine CDM does not support policy check
 // API yet. Remove this condition when the CDM is updated.
-// TODO(crbug.com/851027): Reenable this test on Windows after bug is fixed.
-#if defined(WIDEVINE_CDM_AVAILABLE) && (defined(OS_CHROMEOS) || defined(OS_WIN))
+#if defined(WIDEVINE_CDM_AVAILABLE) && defined(OS_CHROMEOS)
     if (IsWidevine(CurrentKeySystem())) {
       DVLOG(0) << "Skipping test due to HDCP policy check related bugs.";
       return;
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc
index 28fc4a1..0814937 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/navigation_predictor/navigation_predictor.h"
 
 #include "base/logging.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "chrome/browser/engagement/site_engagement_service.h"
@@ -13,6 +14,7 @@
 #include "content/public/browser/site_instance.h"
 #include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "third_party/blink/public/common/features.h"
 #include "url/gurl.h"
 
 struct NavigationPredictor::NavigationScore {
@@ -39,7 +41,9 @@
           render_frame_host->GetSiteInstance()->GetBrowserContext()) {
   DCHECK(browser_context_);
   DETACH_FROM_SEQUENCE(sequence_checker_);
+  InitializeFieldTrialMetricScales();
 }
+
 NavigationPredictor::~NavigationPredictor() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
@@ -62,6 +66,26 @@
          metric.source_url.SchemeIsHTTPOrHTTPS();
 }
 
+void NavigationPredictor::InitializeFieldTrialMetricScales() {
+  const base::Feature& feature = blink::features::kRecordAnchorMetricsVisible;
+  ratio_area_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "ratio_area_scale", ratio_area_scale_);
+  is_in_iframe_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "is_in_iframe_scale", is_in_iframe_scale_);
+  is_same_host_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "is_same_host_scale", is_same_host_scale_);
+  contains_image_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "contains_image_scale", contains_image_scale_);
+  is_url_incremented_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "is_url_incremented_scale", is_url_incremented_scale_);
+  source_engagement_score_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "source_engagement_score_scale", source_engagement_score_scale_);
+  target_engagement_score_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "target_engagement_score_scale", target_engagement_score_scale_);
+  area_rank_scale_ = base::GetFieldTrialParamByFeatureAsInt(
+      feature, "area_rank_scale", area_rank_scale_);
+}
+
 void NavigationPredictor::RecordTimingOnClick() {
   base::TimeTicks current_timing = base::TimeTicks::Now();
 
@@ -289,6 +313,9 @@
         engagement_service->GetScore(metric->target_url);
     DCHECK(target_engagement_score >= 0 &&
            target_engagement_score <= engagement_service->GetMaxPoints());
+    UMA_HISTOGRAM_COUNTS_100(
+        "AnchorElementMetrics.Visible.HrefEngagementScore2",
+        static_cast<int>(target_engagement_score));
 
     // Anchor elements with the same area are assigned with the same rank.
     size_t area_rank = i;
@@ -296,7 +323,8 @@
       area_rank = navigation_scores[navigation_scores.size() - 1]->area_rank;
 
     double score = CalculateAnchorNavigationScore(
-        *metric, document_engagement_score, target_engagement_score, area_rank);
+        *metric, document_engagement_score, target_engagement_score, area_rank,
+        metrics.size());
 
     navigation_scores.push_back(std::make_unique<NavigationScore>(
         metric->target_url, area_rank, score));
@@ -324,10 +352,18 @@
     const blink::mojom::AnchorElementMetrics& metrics,
     double document_engagement_score,
     double target_engagement_score,
-    int area_rank) const {
+    int area_rank,
+    int number_of_anchors) const {
   // TODO(chelu): https://crbug.com/850624/. Experiment with other heuristic
   // algorithms for computing the anchor elements score.
-  return metrics.ratio_visible_area;
+  return ratio_area_scale_ * metrics.ratio_visible_area +
+         is_same_host_scale_ * metrics.is_same_host +
+         contains_image_scale_ * metrics.contains_image +
+         is_in_iframe_scale_ * metrics.is_in_iframe +
+         is_url_incremented_scale_ * metrics.is_url_incremented_by_one +
+         source_engagement_score_scale_ * document_engagement_score +
+         target_engagement_score_scale_ * target_engagement_score +
+         area_rank_scale_ * (number_of_anchors - area_rank);
 }
 
 void NavigationPredictor::MaybeTakeActionOnLoad(
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.h b/chrome/browser/navigation_predictor/navigation_predictor.h
index da9555f7..b01ef8dce 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.h
+++ b/chrome/browser/navigation_predictor/navigation_predictor.h
@@ -52,6 +52,10 @@
   bool IsValidMetricFromRenderer(
       const blink::mojom::AnchorElementMetrics& metric) const;
 
+  // Retrieve scaling factors for each metric from Finch and save to this class.
+  // These scales are used to compute navigation scores.
+  void InitializeFieldTrialMetricScales();
+
   // Returns site engagement service, which can be used to get site engagement
   // score. Return value is guaranteed to be non-null.
   SiteEngagementService* GetEngagementService() const;
@@ -71,7 +75,8 @@
       const blink::mojom::AnchorElementMetrics& metrics,
       double document_engagement_score,
       double target_engagement_score,
-      int area_rank) const;
+      int area_rank,
+      int number_of_anchors) const;
 
   // Given a vector of navigation scores sorted in descending order, decide what
   // action to take, or decide not to do anything. Example actions including
@@ -101,6 +106,16 @@
   int number_of_anchors_in_iframe_ = 0;
   int number_of_anchors_url_incremented_ = 0;
 
+  // Scaling factors used to compute navigation scores.
+  int ratio_area_scale_ = 100;
+  int is_same_host_scale_ = 0;
+  int contains_image_scale_ = 0;
+  int is_in_iframe_scale_ = 0;
+  int is_url_incremented_scale_ = 0;
+  int source_engagement_score_scale_ = 0;
+  int target_engagement_score_scale_ = 0;
+  int area_rank_scale_ = 0;
+
   // Timing of document loaded and last click.
   base::TimeTicks document_loaded_timing_;
   base::TimeTicks last_click_timing_;
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc b/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc
index 798ac79..d34be1b 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc
@@ -35,7 +35,8 @@
       const blink::mojom::AnchorElementMetrics& metrics,
       double document_engagement_score,
       double target_engagement_score,
-      int area_rank) const override {
+      int area_rank,
+      int number_of_anchors) const override {
     area_rank_map_.emplace(std::make_pair(metrics.target_url, area_rank));
     return 100 * metrics.ratio_area;
   }
diff --git a/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.cc b/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.cc
new file mode 100644
index 0000000..d45a9ab
--- /dev/null
+++ b/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.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 "base/android/jni_android.h"
+#include "chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h"
+#include "chrome/browser/offline_pages/prefetch/prefetch_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "components/offline_pages/core/prefetch/prefetch_service.h"
+#include "jni/PrefetchConfiguration_jni.h"
+
+using base::android::JavaParamRef;
+
+// These functions fulfill the Java to native link between
+// PrefetchConfiguration.java and PrefetchConfigurationImpl.
+
+namespace offline_pages {
+namespace android {
+
+namespace {
+
+PrefetchConfigurationImpl* PrefetchConfigurationImplFromJProfile(
+    const JavaParamRef<jobject>& jprofile) {
+  Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
+  if (!profile)
+    return nullptr;
+
+  PrefetchService* prefetch_service =
+      PrefetchServiceFactory::GetForBrowserContext(profile);
+  if (!prefetch_service)
+    return nullptr;
+
+  // The cast below is safe because PrefetchConfigurationImpl is Chrome's
+  // implementation of PrefetchConfiguration.
+  return static_cast<PrefetchConfigurationImpl*>(
+      prefetch_service->GetPrefetchConfiguration());
+}
+
+}  // namespace
+
+JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsPrefetchingEnabled(
+    JNIEnv* env,
+    const JavaParamRef<jclass>& jcaller,
+    const JavaParamRef<jobject>& jprofile) {
+  PrefetchConfigurationImpl* config_impl =
+      PrefetchConfigurationImplFromJProfile(jprofile);
+  if (config_impl)
+    return static_cast<jboolean>(config_impl->IsPrefetchingEnabled());
+  return false;
+}
+
+JNI_EXPORT void JNI_PrefetchConfiguration_SetPrefetchingEnabledInSettings(
+    JNIEnv* env,
+    const JavaParamRef<jclass>& jcaller,
+    const JavaParamRef<jobject>& jprofile,
+    jboolean enabled) {
+  PrefetchConfigurationImpl* config_impl =
+      PrefetchConfigurationImplFromJProfile(jprofile);
+  if (config_impl)
+    config_impl->SetPrefetchingEnabledInSettings(enabled);
+}
+
+}  // namespace android
+}  // namespace offline_pages
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
index 571af2a3..8a5a05a 100644
--- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
@@ -9,6 +9,7 @@
   host = "bluetooth_pairing_dialog"
   html_in_files = [ "bluetooth_pairing_dialog.html" ]
   html_out_files = [ "vulcanized.html" ]
+  html_out_files_polymer2 = [ "vulcanized.p2.html" ]
 
   input = rebase_path(".", root_build_dir)
   js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
index 971547a..e830c7e 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
@@ -9,6 +9,7 @@
   host = "internet_config_dialog"
   html_in_files = [ "internet_config_dialog.html" ]
   html_out_files = [ "vulcanized.html" ]
+  html_out_files_polymer2 = [ "vulcanized.p2.html" ]
 
   input = rebase_path(".", root_build_dir)
   js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
index 1e2e0b8..b171f205 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -9,6 +9,7 @@
   host = "internet_detail_dialog"
   html_in_files = [ "internet_detail_dialog.html" ]
   html_out_files = [ "vulcanized.html" ]
+  html_out_files_polymer2 = [ "vulcanized.p2.html" ]
 
   input = rebase_path(".", root_build_dir)
   js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index ad5b710f..acbe97cf 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -359,6 +359,8 @@
 
   var message = {cmd: 'updateTheme'};
   message.isThemeDark = isThemeDark;
+  message.isUsingTheme =
+      !info.customBackgroundConfigured && !info.usingDefaultTheme;
 
   var titleColor = NTP_DESIGN.titleColor;
   if (!info.usingDefaultTheme && info.textColorRgba) {
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css
index 2645078..bcffbbf 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.css
+++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -4,6 +4,7 @@
 
 html {
   /* Material Design constants */
+  --md-edit-menu-size: 20px;
   --md-fallback-letter-size: 21px;
   --md-favicon-size: 24px;
   --md-icon-margin-bottom: 16px;
@@ -484,13 +485,6 @@
   width: var(--md-favicon-size);
 }
 
-.md-title-container {
-  background-color: white;
-  border-radius: 12px;
-  height: 24px;
-  padding: 4px;
-}
-
 .md-title {
   color: rgba(33, 32, 36, 0.86);
   font-family: 'Roboto', arial, sans-serif;
@@ -498,15 +492,31 @@
   font-weight: 500;
   height: var(--md-title-height);
   line-height: var(--md-title-height);
-  overflow: hidden;
   text-align: center;
-  text-overflow: ellipsis;
-  white-space: nowrap;
   width: 96px;
   word-break: break-word;
   word-wrap: break-word;
 }
 
+/* Apply when a custom background is set */
+body.dark-theme .md-title {
+  color: rgb(248, 249, 250);
+  text-shadow: 0 0 16px rgba(0, 0, 0, 0.3);
+}
+
+/* Apply only when a theme is installed */
+body.using-theme .md-title-container {
+  background-color: white;
+  border-radius: 12px;
+  height: 24px;
+  padding: 4px;
+}
+
+body.using-theme .md-title {
+  color: rgba(33, 32, 36, 0.86);
+  text-shadow: unset;
+}
+
 .md-menu {
   background-color: transparent;
   border: none;
@@ -542,9 +552,16 @@
   width: var(--md-menu-size);
 }
 
+.md-edit-menu {
+  height: var(--md-edit-menu-size);
+  width: var(--md-edit-menu-size);
+}
+
 .md-edit-menu::after {
-  --mask-width: var(--md-menu-size);
+  --mask-width: var(--md-edit-menu-size);
   -webkit-mask-image: url(chrome-search://most-visited/edit_menu.svg);
+  height: var(--md-edit-menu-size);
+  width: var(--md-edit-menu-size);
 }
 
 body.dark-theme .md-menu::after {
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js
index e26bbc46..cea6402e 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.js
+++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -276,6 +276,7 @@
 var updateTheme = function(info) {
   document.body.style.setProperty('--tile-title-color', info.tileTitleColor);
   document.body.classList.toggle('dark-theme', info.isThemeDark);
+  document.body.classList.toggle('using-theme', info.isUsingTheme);
 };
 
 
@@ -345,6 +346,10 @@
   // If this is Material Design, re-balance the tiles if there are more than
   // |MD_MAX_TILES_PER_ROW| in order to make even rows.
   if (isMDEnabled) {
+    // Called after appending to document so that css styles are active.
+    truncateTitleText(
+        parent.lastChild.querySelectorAll('.' + CLASSES.MD_TITLE));
+
     if (cur.childNodes.length > MD_MAX_TILES_PER_ROW) {
       cur.style.maxWidth =
           'calc(var(--md-tile-width) * ' + Math.ceil(cur.childNodes.length / 2);
@@ -363,6 +368,25 @@
   tiles = document.createElement('div');
 };
 
+/**
+ * Truncates titles that are longer than one line and appends an ellipsis. Text
+ * overflow in CSS ("text-overflow: ellipsis") requires "overflow: hidden",
+ * which will cut off the title's text shadow. Only used for Material Design
+ * tiles.
+ */
+function truncateTitleText(titles) {
+  for (let i = 0; i < titles.length; i++) {
+    let el = titles[i];
+    const originalTitle = el.innerText;
+    let truncatedTitle = el.innerText;
+    while (el.scrollHeight > el.offsetHeight && truncatedTitle.length > 0) {
+      el.innerText = (truncatedTitle = truncatedTitle.slice(0, -1)) + '...';
+    }
+    if (truncatedTitle.length === 0) {
+      console.error('Title truncation failed: ' + originalTitle);
+    }
+  }
+}
 
 /**
  * Handler for the 'show' message from the host page, called when it wants to
diff --git a/chrome/browser/resources/md_bookmarks/BUILD.gn b/chrome/browser/resources/md_bookmarks/BUILD.gn
index 0c28dd7d..a479745b 100644
--- a/chrome/browser/resources/md_bookmarks/BUILD.gn
+++ b/chrome/browser/resources/md_bookmarks/BUILD.gn
@@ -9,6 +9,7 @@
   host = "bookmarks"
   html_in_files = [ "bookmarks.html" ]
   html_out_files = [ "vulcanized.html" ]
+  html_out_files_polymer2 = [ "vulcanized.p2.html" ]
 
   input = rebase_path(".", root_build_dir)
   js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/md_downloads/BUILD.gn b/chrome/browser/resources/md_downloads/BUILD.gn
index f4aaa13..fffbd84a 100644
--- a/chrome/browser/resources/md_downloads/BUILD.gn
+++ b/chrome/browser/resources/md_downloads/BUILD.gn
@@ -10,6 +10,7 @@
   host = "downloads"
   html_in_files = [ "downloads.html" ]
   html_out_files = [ "vulcanized.html" ]
+  html_out_files_polymer2 = [ "vulcanized.p2.html" ]
   input = rebase_path(".", root_build_dir)
   insert_in_head = "<base href=chrome://downloads>"
   js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/md_extensions/BUILD.gn b/chrome/browser/resources/md_extensions/BUILD.gn
index 6b0ba11..cddcce5 100644
--- a/chrome/browser/resources/md_extensions/BUILD.gn
+++ b/chrome/browser/resources/md_extensions/BUILD.gn
@@ -14,6 +14,7 @@
   host = "extensions"
   html_in_files = [ "extensions.html" ]
   html_out_files = [ "vulcanized.html" ]
+  html_out_files_polymer2 = [ "vulcanized.p2.html" ]
   insert_in_head = "<base href=\"chrome://extensions\">"
   input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
   js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/md_extensions/extensions_resources_vulcanized.grd b/chrome/browser/resources/md_extensions/extensions_resources_vulcanized.grd
index d3cb0231..f0c7730 100644
--- a/chrome/browser/resources/md_extensions/extensions_resources_vulcanized.grd
+++ b/chrome/browser/resources/md_extensions/extensions_resources_vulcanized.grd
@@ -13,6 +13,7 @@
   <release seq="1">
     <includes>
       <include name="IDR_MD_EXTENSIONS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\md_extensions\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_MD_EXTENSIONS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\md_extensions\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
       <include name="IDR_MD_EXTENSIONS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\md_extensions\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
     </includes>
   </release>
diff --git a/chrome/browser/resources/md_history/BUILD.gn b/chrome/browser/resources/md_history/BUILD.gn
index 7b647e03..4523731 100644
--- a/chrome/browser/resources/md_history/BUILD.gn
+++ b/chrome/browser/resources/md_history/BUILD.gn
@@ -15,6 +15,10 @@
     "app.vulcanized.html",
     "lazy_load.vulcanized.html",
   ]
+  html_out_files_polymer2 = [
+    "app.vulcanized.p2.html",
+    "lazy_load.vulcanized.p2.html",
+  ]
 
   input = rebase_path(".", root_build_dir)
   js_out_files = [
diff --git a/chrome/browser/resources/print_preview/BUILD.gn b/chrome/browser/resources/print_preview/BUILD.gn
index e36e456..e553670 100644
--- a/chrome/browser/resources/print_preview/BUILD.gn
+++ b/chrome/browser/resources/print_preview/BUILD.gn
@@ -15,6 +15,7 @@
     host = "print"
     html_in_files = [ "print_preview_new.html" ]
     html_out_files = [ "vulcanized.html" ]
+    html_out_files_polymer2 = [ "vulcanized.p2.html" ]
     insert_in_head = "<base href=\"chrome://print\">"
     input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
     js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/print_preview/new/preview_area.js b/chrome/browser/resources/print_preview/new/preview_area.js
index 1bdef44..98fb39c0 100644
--- a/chrome/browser/resources/print_preview/new/preview_area.js
+++ b/chrome/browser/resources/print_preview/new/preview_area.js
@@ -480,7 +480,13 @@
     if (this.inFlightRequestId_ != previewResponseId)
       return;
     const pageNumber = pageIndex + 1;
-    const index = this.getSettingValue('pages').indexOf(pageNumber);
+    let index = this.getSettingValue('pages').indexOf(pageNumber);
+    // When pagesPerSheet > 1, the backend will always return page indices 0 to
+    // N-1, where N is the total page count of the N-upped document.
+    const pagesPerSheet =
+        /** @type {number} */ (this.getSettingValue('pagesPerSheet'));
+    if (pagesPerSheet > 1)
+      index = pageIndex;
     if (index == 0)
       this.onPreviewStart_(previewUid, pageIndex);
     if (index != -1)
diff --git a/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd b/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
index 3acbd30..4d17378 100644
--- a/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
+++ b/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
@@ -13,6 +13,7 @@
   <release seq="1">
     <includes>
       <include name="IDR_PRINT_PREVIEW_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\print_preview\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
+      <include name="IDR_PRINT_PREVIEW_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\print_preview\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_PRINT_PREVIEW_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\print_preview\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" />
     </includes>
   </release>
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index cd3da04a..7771042 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -22,6 +22,10 @@
       "vulcanized.html",
       "lazy_load.vulcanized.html",
     ]
+    html_out_files_polymer2 = [
+      "vulcanized.p2.html",
+      "lazy_load.vulcanized.p2.html",
+    ]
     insert_in_head = "<base href=\"chrome://settings\">"
     input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
     js_out_files = [
diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html
index fa672ee7..c6df3cae 100644
--- a/chrome/browser/resources/settings/icons.html
+++ b/chrome/browser/resources/settings/icons.html
@@ -50,6 +50,7 @@
       <!-- Icons for MultiDevice Settings UI -->
       <g id="smart-lock" fill="#9AA0A6" fill-rule="nonzero"><path d="M18,9 L17,9 L17,7 C17,4.24 14.76,2 12,2 C9.24,2 7,4.24 7,7 L7,9 L6,9 C4.9,9 4,9.9 4,11 L4,21 C4,22.1 4.9,23 6,23 L18,23 C19.1,23 20,22.1 20,21 L20,11 C20,9.9 19.1,9 18,9 Z M9,7 C9,5.34 10.34,4 12,4 C13.66,4 15,5.34 15,7 L15,9 L9,9 L9,7 Z M18,21 L6,21 L6,11 L18,11 L18,21 Z M12,18 C13.1,18 14,17.1 14,16 C14,14.9 13.1,14 12,14 C10.9,14 10,14.9 10,16 C10,17.1 10.9,18 12,18 Z"></path></g>
 
+      <g id="sms-connect" fill="#9AA0A6" fill-rule="nonzero"><path d="M19.9593506,2 C21.0593506,2 22,2.89658203 22,3.99658203 L22,16.0036621 C22,17.1036621 21.0593506,18.0036621 19.9593506,18.0036621 L6.00878906,18.0036621 L2.00878906,22.4 L2.01878906,3.99658203 C2.01878906,2.89658203 2.90878906,2 4.00878906,2 L19.9593506,2 Z M8,8.56896973 L4.5,12 L8,15.6103516 L8,13 L14,13 L14,11 L8,11 L8,8.56896973 Z M20.5688477,7 L17,3.57207031 L17,6 L11,6 L11,8 L17,8 L17,10.5720703 L20.5688477,7 Z"></path></g>
 </if>
 
       <!-- Protected Content SVG -->
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html
index 17b5587..f97c9047 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html
@@ -19,7 +19,7 @@
         padding-inline-start: 18px;
       }
     </style>
-    <div class="settings-box two-line first"
+    <div class="settings-box two-line"
         on-click="handleItemClick_"
         actionable$="[[hasSubpageClickHandler_(subpageRoute)]]">
       <iron-icon icon="[[iconName]]"></iron-icon>
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.js b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.js
index 6b71b21..655b3c4 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.js
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.js
@@ -31,7 +31,7 @@
 
     /**
      * The full icon name used provided by the containing iron-iconset-svg
-     * (i.e. [iron-iconset-svg name]:[SVG <g> tag id]
+     * (i.e. [iron-iconset-svg name]:[SVG <g> tag id]).
      * @type {string}
      */
     iconName: String,
@@ -54,12 +54,6 @@
   },
 
   /** @private */
-  onChangeToggle_: function() {
-    // TODO (jordynass): Trigger the correct workflow.
-    console.log('Toggle changed');
-  },
-
-  /** @private */
   handleItemClick_: function(event) {
     if (!this.subpageRoute)
       return;
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_toggle.js b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_toggle.js
index b1db272..c580631b 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_toggle.js
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_toggle.js
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
 /**
  * @fileoverview
  * Toggle button with the SettingsBooleanControlBehavior of the
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_page.js b/chrome/browser/resources/settings/multidevice_page/multidevice_page.js
index 9ccd097..4c7af9d 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_page.js
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_page.js
@@ -14,12 +14,6 @@
   behaviors: [I18nBehavior, PrefsBehavior],
 
   properties: {
-    /** SettingsPrefsElement 'prefs' Object reference. See prefs.js. */
-    prefs: {
-      type: Object,
-      notify: true,
-    },
-
     /** @type {MultiDevicePageContentData} */
     pageContentData: Object,
 
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html b/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html
index 17b3615..804ffe8 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html
@@ -49,6 +49,22 @@
             </settings-multidevice-feature-toggle>
           </div>
         </settings-multidevice-feature-item>
+        <settings-multidevice-feature-item icon-name="settings:sms-connect"
+            feature-name="$i18n{multideviceAndroidMessagesItemTitle}"
+            feature-summary-html="$i18n{multideviceAndroidMessagesItemSummary}">
+          <div slot="feature-contoller">
+            <template is="dom-if" if="[[androidMessagesRequiresSetup_]]">
+              <paper-button on-click="handleAndroidMessagesButtonClick_">
+                $i18n{multideviceSetupButton}
+              </paper-button>
+            </template>
+            <template is="dom-if" if="[[!androidMessagesRequiresSetup_]]">
+              <settings-multidevice-feature-toggle
+                  pref="{{prefs.multidevice.sms_connect_enabled}}">
+              </settings-multidevice-feature-toggle>
+            </template>
+          </div>
+        </settings-multidevice-feature-item>
       </div>
     </template>
   </template>
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.js b/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.js
index 5c2af21ff..f0d55143 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.js
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.js
@@ -15,12 +15,6 @@
   behaviors: [I18nBehavior, PrefsBehavior],
 
   properties: {
-    /** SettingsPrefsElement 'prefs' Object reference. See prefs.js. */
-    prefs: {
-      type: Object,
-      notify: true,
-    },
-
     /** @type {?SettingsRoutes} */
     routes: {
       type: Object,
@@ -29,6 +23,25 @@
 
     /** @type {MultiDevicePageContentData} */
     pageContentData: Object,
+
+    // TODO(jordynass): Set this variable once the information can be retrieved
+    // by whatever implementation we use (possibly an IPC or from prefs).
+    /**
+     * If SMS Connect requires setup, it displays a paper button prompting the
+     * setup flow. If it is already set up, it displays a regular toggle for the
+     * feature.
+     * @private {boolean}
+     */
+    androidMessagesRequiresSetup_: {
+      type: Boolean,
+      value: true,
+    },
+  },
+
+  /** @private */
+  handleAndroidMessagesButtonClick_: function() {
+    this.androidMessagesRequiresSetup_ = false;
+    this.setPrefValue('multidevice.sms_connect_enabled', true);
   },
 
   /**
diff --git a/chrome/browser/resources/settings/settings_resources_vulcanized.grd b/chrome/browser/resources/settings/settings_resources_vulcanized.grd
index fcd5540c5..46a832e1 100644
--- a/chrome/browser/resources/settings/settings_resources_vulcanized.grd
+++ b/chrome/browser/resources/settings/settings_resources_vulcanized.grd
@@ -13,8 +13,10 @@
   <release seq="1">
     <includes>
       <include name="IDR_MD_SETTINGS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_MD_SETTINGS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
       <include name="IDR_MD_SETTINGS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\settings\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
       <include name="IDR_MD_SETTINGS_LAZY_LOAD_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_MD_SETTINGS_LAZY_LOAD_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
       <include name="IDR_MD_SETTINGS_LAZY_LOAD_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" />
     </includes>
   </release>
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h
index 0a0c5fc..8195e32 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -281,6 +281,8 @@
       VerifyUnhandledSyncPasswordReuseUponClearHistoryDeletion);
   FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest,
                            VerifyCanShowInterstitial);
+  FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest,
+                           VerifySendsPingForAboutBlank);
   FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceBrowserTest,
                            VerifyCheckGaiaPasswordChange);
   FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceBrowserTest,
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index b4e9325b..578a21d1 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -145,6 +145,9 @@
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
     profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, true);
+    profile()->GetPrefs()->SetInteger(
+        prefs::kPasswordProtectionWarningTrigger,
+        PasswordProtectionTrigger::PHISHING_REUSE);
     HostContentSettingsMap::RegisterProfilePrefs(test_pref_service_.registry());
     content_setting_map_ = new HostContentSettingsMap(
         &test_pref_service_, false /* incognito */, false /* guest_profile */,
@@ -986,4 +989,11 @@
       PasswordReuseEvent::ENTERPRISE_PASSWORD, trigger_url));
 }
 
+TEST_F(ChromePasswordProtectionServiceTest, VerifySendsPingForAboutBlank) {
+  RequestOutcome reason;
+  EXPECT_TRUE(service_->CanSendPing(
+      LoginReputationClientRequest::PASSWORD_REUSE_EVENT, GURL("about:blank"),
+      PasswordReuseEvent::SIGN_IN_PASSWORD, &reason));
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
index 553a04d..44dd509 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -128,6 +128,9 @@
   // The description view can be nullptr.
   virtual views::View* CreateDescriptionLabel();
 
+  // Creates a description label iff the description text isn't empty.
+  views::Label* CreateDescriptionLabelInternal() const;
+
  private:
   void AddSpacerWithSize(int spacer_width,
                          bool resize,
@@ -370,6 +373,10 @@
 }
 
 views::View* AutofillPopupItemView::CreateDescriptionLabel() {
+  return CreateDescriptionLabelInternal();
+}
+
+views::Label* AutofillPopupItemView::CreateDescriptionLabelInternal() const {
   const base::string16& description_text =
       popup_view_->controller()->GetElidedLabelAt(line_number_);
   if (!description_text.empty()) {
@@ -442,9 +449,12 @@
 }
 
 views::View* PasswordPopupSuggestionView::CreateDescriptionLabel() {
-  views::View* label = AutofillPopupSuggestionView::CreateDescriptionLabel();
-  return label ? new ConstrainedWidthView(label, kAutofillPopupPasswordMaxWidth)
-               : nullptr;
+  views::Label* label = CreateDescriptionLabelInternal();
+  if (!label)
+    return nullptr;
+
+  label->SetElideBehavior(gfx::TRUNCATE);
+  return new ConstrainedWidthView(label, kAutofillPopupPasswordMaxWidth);
 }
 
 PasswordPopupSuggestionView::PasswordPopupSuggestionView(
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
index 4bbcc0a..aa30c75 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -151,7 +151,7 @@
                            V1BackButton);
   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
                            ToggleTabletModeOnMinimizedWindow);
-  FRIEND_TEST_ALL_PREFIXES(HostedAppNonClientFrameViewAshTest,
+  FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
                            ActiveStateOfButtonMatchesWidget);
   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
                            RestoreMinimizedBrowserUpdatesCaption);
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
index f6e05ef5..6a2595d 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -77,7 +77,6 @@
 #include "ui/aura/test/env_test_helper.h"
 #include "ui/base/class_property.h"
 #include "ui/base/hit_test.h"
-#include "ui/base/ui_base_features.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/base_event_utils.h"
@@ -479,6 +478,19 @@
                test.size_button()->icon_definition_for_test()->name);
 }
 
+// Regression test for https://crbug.com/839955
+IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest,
+                       ActiveStateOfButtonMatchesWidget) {
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
+
+  ash::FrameCaptionButtonContainerView::TestApi test(
+      GetFrameViewAsh(browser_view)->caption_button_container_);
+  EXPECT_TRUE(test.size_button()->paint_as_active());
+
+  browser_view->GetWidget()->Deactivate();
+  EXPECT_FALSE(test.size_button()->paint_as_active());
+}
+
 // This is a regression test that session restore minimized browser should
 // update caption buttons (https://crbug.com/827444).
 IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest,
@@ -795,19 +807,14 @@
     app_menu_button_ = hosted_app_button_container_->app_menu_button_;
   }
 
-  AppMenu* GetAppMenu() {
-    return hosted_app_button_container_->app_menu_button_
-        ->app_menu_for_testing();
+  AppMenu* GetAppMenu(HostedAppButtonContainer* button_container) {
+    return button_container->app_menu_button_->app_menu_for_testing();
   }
 
-  SkColor GetActiveColor() {
+  SkColor GetActiveColor(HostedAppButtonContainer* button_container) {
     return hosted_app_button_container_->active_color_;
   }
 
-  bool GetPaintingAsActive() {
-    return hosted_app_button_container_->paint_as_active_;
-  }
-
   PageActionIconView* GetPageActionIcon(PageActionIconType type) {
     return browser_view_->toolbar_button_provider()
         ->GetPageActionIconContainerView()
@@ -868,7 +875,7 @@
   aura::Window* window = browser_view_->GetWidget()->GetNativeWindow();
   EXPECT_EQ(GetThemeColor(),window->GetProperty(ash::kFrameActiveColorKey));
   EXPECT_EQ(GetThemeColor(), window->GetProperty(ash::kFrameInactiveColorKey));
-  EXPECT_EQ(SK_ColorWHITE, GetActiveColor());
+  EXPECT_EQ(SK_ColorWHITE, GetActiveColor(hosted_app_button_container_));
 }
 
 // Make sure that for hosted apps, the height of the frame doesn't exceed the
@@ -947,9 +954,9 @@
 // Tests that the show app menu command opens the app menu for web app windows.
 IN_PROC_BROWSER_TEST_P(HostedAppNonClientFrameViewAshTest,
                        BrowserCommandShowAppMenu) {
-  EXPECT_EQ(nullptr, GetAppMenu());
+  EXPECT_EQ(nullptr, GetAppMenu(hosted_app_button_container_));
   chrome::ExecuteCommand(app_browser_, IDC_SHOW_APP_MENU);
-  EXPECT_NE(nullptr, GetAppMenu());
+  EXPECT_NE(nullptr, GetAppMenu(hosted_app_button_container_));
 }
 
 // Tests that the focus next pane command focuses the app menu for web app
@@ -1011,7 +1018,7 @@
   SimulateClickOnView(app_menu_button_);
 
   // All extension actions should always be showing in the menu.
-  EXPECT_EQ(3u, GetAppMenu()
+  EXPECT_EQ(3u, GetAppMenu(hosted_app_button_container_)
                     ->extension_toolbar_for_testing()
                     ->container_for_testing()
                     ->VisibleBrowserActions());
@@ -1022,27 +1029,6 @@
   EXPECT_EQ(1u, browser_actions_container_->VisibleBrowserActions());
 }
 
-// Regression test for https://crbug.com/839955
-IN_PROC_BROWSER_TEST_P(HostedAppNonClientFrameViewAshTest,
-                       ActiveStateOfButtonMatchesWidget) {
-  // The caption button part of this test is covered for OopAsh by
-  // CustomFrameViewAshTest::ActiveStateOfButtonMatchesWidget.
-  if (features::IsAshInBrowserProcess()) {
-    ash::FrameCaptionButtonContainerView::TestApi test(
-        GetFrameViewAsh(browser_view_)->caption_button_container_);
-    EXPECT_TRUE(test.size_button()->paint_as_active());
-  }
-  EXPECT_TRUE(GetPaintingAsActive());
-
-  browser_view_->GetWidget()->Deactivate();
-  if (features::IsAshInBrowserProcess()) {
-    ash::FrameCaptionButtonContainerView::TestApi test(
-        GetFrameViewAsh(browser_view_)->caption_button_container_);
-    EXPECT_FALSE(test.size_button()->paint_as_active());
-  }
-  EXPECT_FALSE(GetPaintingAsActive());
-}
-
 namespace {
 
 class BrowserNonClientFrameViewAshBackButtonTest
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index b15d21e..ff463fae 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -278,8 +278,6 @@
 
   size_animation_.Reset(1);
 
-  // This is for hover effect mouse event handling.
-  set_notify_enter_exit_on_child(true);
   hover_animation_.SetSlideDuration(200);
 }
 
@@ -1166,15 +1164,6 @@
   BrowserView::Paint1pxHorizontalLine(canvas, border_color, bounds, true);
 }
 
-void LocationBarView::OnMouseEntered(const ui::MouseEvent& event) {
-  // Only show the hover animation when omnibox is in unfocused steady state.
-  if (!omnibox_view_->HasFocus())
-    hover_animation_.Show();
-}
-void LocationBarView::OnMouseExited(const ui::MouseEvent& event) {
-  hover_animation_.Hide();
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // LocationBarView, private views::DragController implementation:
 
@@ -1286,6 +1275,16 @@
     RefreshBackground();
 }
 
+void LocationBarView::OnOmniboxHovered(bool is_hovering) {
+  if (is_hovering) {
+    // Only show the hover animation when omnibox is in unfocused steady state.
+    if (!omnibox_view_->HasFocus())
+      hover_animation_.Show();
+  } else {
+    hover_animation_.Hide();
+  }
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // LocationBarView, private DropdownBarHostDelegate implementation:
 
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h
index 7b25754..8451046 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.h
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -259,6 +259,10 @@
   void OnOmniboxFocused();
   void OnOmniboxBlurred();
 
+  // Called when omnibox view receives mouse notifications relevant to hover.
+  // |is_hovering| should be true when mouse is in omnibox; false when exited.
+  void OnOmniboxHovered(bool is_hovering);
+
  private:
   FRIEND_TEST_ALL_PREFIXES(SecurityIndicatorTest, CheckIndicatorText);
   FRIEND_TEST_ALL_PREFIXES(TouchLocationBarViewBrowserTest,
@@ -356,8 +360,6 @@
   void OnFocus() override;
   void OnPaint(gfx::Canvas* canvas) override;
   void OnPaintBorder(gfx::Canvas* canvas) override;
-  void OnMouseEntered(const ui::MouseEvent& event) override;
-  void OnMouseExited(const ui::MouseEvent& event) override;
 
   // views::DragController:
   void WriteDragDataForView(View* sender,
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 6b5ef6b1..89b0c572 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -774,6 +774,16 @@
     ApplyStyle(gfx::STRIKE, true, range);
 }
 
+void OmniboxViewViews::OnMouseMoved(const ui::MouseEvent& event) {
+  if (location_bar_view_)
+    location_bar_view_->OnOmniboxHovered(true);
+}
+
+void OmniboxViewViews::OnMouseExited(const ui::MouseEvent& event) {
+  if (location_bar_view_)
+    location_bar_view_->OnOmniboxHovered(false);
+}
+
 bool OmniboxViewViews::IsItemForCommandIdDynamic(int command_id) const {
   return command_id == IDS_PASTE_AND_GO;
 }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.h b/chrome/browser/ui/views/omnibox/omnibox_view_views.h
index 1d941f2..2af3a44 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.h
@@ -216,6 +216,10 @@
   void SetEmphasis(bool emphasize, const gfx::Range& range) override;
   void UpdateSchemeStyle(const gfx::Range& range) override;
 
+  // views::View
+  void OnMouseMoved(const ui::MouseEvent& event) override;
+  void OnMouseExited(const ui::MouseEvent& event) override;
+
   // views::Textfield:
   bool IsItemForCommandIdDynamic(int command_id) const override;
   base::string16 GetLabelForCommandId(int command_id) const override;
diff --git a/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc b/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
index 7063b4d1..7249881 100644
--- a/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
@@ -13,6 +13,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -93,7 +94,10 @@
   source->SetJsonPath("strings.js");
 #if BUILDFLAG(OPTIMIZE_WEBUI)
   source->UseGzip();
-  source->SetDefaultResource(IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2) ?
+          IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_P2_HTML :
+          IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_HTML);
   source->AddResourcePath("crisper.js",
                           IDR_BLUETOOTH_PAIRING_DIALOG_CRISPER_JS);
 #else
diff --git a/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc b/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
index 0591f3b..514fa71 100644
--- a/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
@@ -17,6 +17,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 
 namespace chromeos {
 
@@ -115,7 +116,10 @@
   source->SetJsonPath("strings.js");
 #if BUILDFLAG(OPTIMIZE_WEBUI)
   source->UseGzip();
-  source->SetDefaultResource(IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2) ?
+          IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_P2_HTML :
+          IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_HTML);
   source->AddResourcePath("crisper.js", IDR_INTERNET_CONFIG_DIALOG_CRISPER_JS);
 #else
   source->SetDefaultResource(IDR_INTERNET_CONFIG_DIALOG_HTML);
diff --git a/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc b/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
index a05bb03c5..91daeef 100644
--- a/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
@@ -18,6 +18,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace chromeos {
@@ -131,7 +132,10 @@
   source->SetJsonPath("strings.js");
 #if BUILDFLAG(OPTIMIZE_WEBUI)
   source->UseGzip();
-  source->SetDefaultResource(IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2) ?
+          IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_P2_HTML :
+          IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_HTML);
   source->AddResourcePath("crisper.js", IDR_INTERNET_DETAIL_DIALOG_CRISPER_JS);
 #else
   source->SetDefaultResource(IDR_INTERNET_DETAIL_DIALOG_HTML);
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index 919aa82..c40f50bb 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -92,15 +92,11 @@
       weak_ptr_factory_(this) {
   DCHECK(js_calls_container);
   set_call_js_prefix(kJsScreenPath);
-  if (features::IsAshInBrowserProcess()) {
-    AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
-    CHECK(accessibility_manager);
-    accessibility_subscription_ = accessibility_manager->RegisterCallback(
-        base::Bind(&CoreOobeHandler::OnAccessibilityStatusChanged,
-                   base::Unretained(this)));
-  } else {
-    NOTIMPLEMENTED();
-  }
+  AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
+  CHECK(accessibility_manager);
+  accessibility_subscription_ = accessibility_manager->RegisterCallback(
+      base::Bind(&CoreOobeHandler::OnAccessibilityStatusChanged,
+                 base::Unretained(this)));
 
   TabletModeClient* tablet_mode_client = TabletModeClient::Get();
   tablet_mode_client->AddObserver(this);
@@ -469,12 +465,6 @@
 }
 
 void CoreOobeHandler::UpdateA11yState() {
-  if (!features::IsAshInBrowserProcess()) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  // TODO(dpolukhin): crbug.com/412891
-  DCHECK(MagnificationManager::Get());
   base::DictionaryValue a11y_info;
   a11y_info.SetBoolean("highContrastEnabled",
                        AccessibilityManager::Get()->IsHighContrastEnabled());
@@ -482,8 +472,15 @@
                        AccessibilityManager::Get()->IsLargeCursorEnabled());
   a11y_info.SetBoolean("spokenFeedbackEnabled",
                        AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
-  a11y_info.SetBoolean("screenMagnifierEnabled",
-                       MagnificationManager::Get()->IsMagnifierEnabled());
+  if (features::IsAshInBrowserProcess()) {
+    DCHECK(MagnificationManager::Get());
+    a11y_info.SetBoolean("screenMagnifierEnabled",
+                         MagnificationManager::Get()->IsMagnifierEnabled());
+  } else {
+    // TODO: get MagnificationManager working with mash.
+    // https://crbug.com/817157
+    NOTIMPLEMENTED_LOG_ONCE();
+  }
   a11y_info.SetBoolean("virtualKeyboardEnabled",
                        AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
   CallJSOrDefer("refreshA11yInfo", a11y_info);
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index 88213e3..946a7b2 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -30,8 +30,9 @@
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/common/content_features.h"
 #include "extensions/common/extension_urls.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -312,7 +313,10 @@
 
 #if BUILDFLAG(OPTIMIZE_WEBUI)
   source->AddResourcePath("crisper.js", IDR_MD_EXTENSIONS_CRISPER_JS);
-  source->SetDefaultResource(IDR_MD_EXTENSIONS_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2) ?
+          IDR_MD_EXTENSIONS_VULCANIZED_P2_HTML :
+          IDR_MD_EXTENSIONS_VULCANIZED_HTML);
   source->UseGzip();
 #else
   // Add all MD Extensions resources.
diff --git a/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc b/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
index 06195fc97..403a5f4a 100644
--- a/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
+++ b/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
@@ -22,6 +22,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 
@@ -135,7 +136,10 @@
                           IDR_MD_BOOKMARKS_IMAGES_FOLDER_SVG);
 #if BUILDFLAG(OPTIMIZE_WEBUI)
   source->AddResourcePath("crisper.js", IDR_MD_BOOKMARKS_CRISPER_JS);
-  source->SetDefaultResource(IDR_MD_BOOKMARKS_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2)
+          ? IDR_MD_BOOKMARKS_VULCANIZED_P2_HTML
+          : IDR_MD_BOOKMARKS_VULCANIZED_HTML);
   source->UseGzip({"images/folder_open.svg", "images/folder.svg"});
 #else
   source->AddResourcePath("actions.html", IDR_MD_BOOKMARKS_ACTIONS_HTML);
diff --git a/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc b/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
index e3938ed4..e1e70e1 100644
--- a/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
+++ b/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
@@ -30,6 +30,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "ui/base/resource/resource_bundle.h"
 
 using content::BrowserContext;
@@ -53,7 +54,6 @@
   source->AddLocalizedString("moreActions", IDS_DOWNLOAD_MORE_ACTIONS);
   source->AddLocalizedString("search", IDS_MD_DOWNLOAD_SEARCH);
 
-
   // No results message that shows instead of the downloads list.
   source->AddLocalizedString("noDownloads", IDS_MD_DOWNLOAD_NO_DOWNLOADS);
   source->AddLocalizedString("noSearchResults", IDS_SEARCH_NO_RESULTS);
@@ -81,16 +81,14 @@
     source->AddLocalizedString("controlShowInFolder", IDS_DOWNLOAD_LINK_SHOW);
   source->AddLocalizedString("controlCancel", IDS_DOWNLOAD_LINK_CANCEL);
   source->AddLocalizedString("controlResume", IDS_DOWNLOAD_LINK_RESUME);
-  source->AddLocalizedString("controlRemoveFromList",
-                             IDS_DOWNLOAD_LINK_REMOVE);
+  source->AddLocalizedString("controlRemoveFromList", IDS_DOWNLOAD_LINK_REMOVE);
   source->AddLocalizedString("controlRetry", IDS_MD_DOWNLOAD_LINK_RETRY);
-  source->AddLocalizedString("controlledByUrl",
-                             IDS_DOWNLOAD_BY_EXTENSION_URL);
+  source->AddLocalizedString("controlledByUrl", IDS_DOWNLOAD_BY_EXTENSION_URL);
 
   PrefService* prefs = profile->GetPrefs();
   source->AddBoolean("allowDeletingHistory",
                      prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory) &&
-                     !profile->IsSupervised());
+                         !profile->IsSupervised());
 
   source->AddLocalizedString("inIncognito", IDS_DOWNLOAD_IN_INCOGNITO);
 
@@ -108,7 +106,10 @@
                    "2x/incognito_marker.png", "2x/no_downloads.png"});
 
   source->AddResourcePath("crisper.js", IDR_MD_DOWNLOADS_CRISPER_JS);
-  source->SetDefaultResource(IDR_MD_DOWNLOADS_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2)
+          ? IDR_MD_DOWNLOADS_VULCANIZED_P2_HTML
+          : IDR_MD_DOWNLOADS_VULCANIZED_HTML);
 #else
   source->AddResourcePath("browser_proxy.html",
                           IDR_MD_DOWNLOADS_BROWSER_PROXY_HTML);
diff --git a/chrome/browser/ui/webui/md_history_ui.cc b/chrome/browser/ui/webui/md_history_ui.cc
index de8af30a..46df9d4 100644
--- a/chrome/browser/ui/webui/md_history_ui.cc
+++ b/chrome/browser/ui/webui/md_history_ui.cc
@@ -30,6 +30,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "services/identity/public/cpp/identity_manager.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -174,12 +175,16 @@
   source->UseGzip(exclude_from_gzip);
 
 #if BUILDFLAG(OPTIMIZE_WEBUI)
+  const bool use_polymer_2 =
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2);
   source->AddResourcePath("app.html",
-                          IDR_MD_HISTORY_APP_VULCANIZED_HTML);
-  source->AddResourcePath("app.crisper.js",
-                          IDR_MD_HISTORY_APP_CRISPER_JS);
+                          use_polymer_2 ? IDR_MD_HISTORY_APP_VULCANIZED_P2_HTML
+                                        : IDR_MD_HISTORY_APP_VULCANIZED_HTML);
+  source->AddResourcePath("app.crisper.js", IDR_MD_HISTORY_APP_CRISPER_JS);
   source->AddResourcePath("lazy_load.html",
-                          IDR_MD_HISTORY_LAZY_LOAD_VULCANIZED_HTML);
+                          use_polymer_2
+                              ? IDR_MD_HISTORY_LAZY_LOAD_VULCANIZED_P2_HTML
+                              : IDR_MD_HISTORY_LAZY_LOAD_VULCANIZED_HTML);
   source->AddResourcePath("lazy_load.crisper.js",
                           IDR_MD_HISTORY_LAZY_LOAD_CRISPER_JS);
 #endif
@@ -217,7 +222,8 @@
 
 void MdHistoryUI::RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
-  registry->RegisterBooleanPref(prefs::kMdHistoryMenuPromoShown, false,
+  registry->RegisterBooleanPref(
+      prefs::kMdHistoryMenuPromoShown, false,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
 }
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index 745683d..9d32928e 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -46,6 +46,7 @@
 #include "content/public/browser/url_data_source.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "extensions/common/constants.h"
 #include "printing/buildflags/buildflags.h"
 #include "printing/page_size_margins.h"
@@ -528,6 +529,10 @@
 #if BUILDFLAG(OPTIMIZE_WEBUI)
   source->AddResourcePath("crisper.js", IDR_PRINT_PREVIEW_CRISPER_JS);
   source->SetDefaultResource(IDR_PRINT_PREVIEW_VULCANIZED_HTML);
+  source->SetDefaultResource(
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2) ?
+          IDR_PRINT_PREVIEW_VULCANIZED_P2_HTML :
+          IDR_PRINT_PREVIEW_VULCANIZED_HTML);
 #else
   for (size_t i = 0; i < kPrintPreviewResourcesSize; ++i) {
     source->AddResourcePath(kPrintPreviewResources[i].name,
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc
index e2feea6..4f81cc0 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -49,6 +49,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
 #include "printing/buildflags/buildflags.h"
 
 #if defined(OS_WIN)
@@ -350,12 +351,18 @@
   web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
 
 #if BUILDFLAG(OPTIMIZE_WEBUI)
+  const bool use_polymer_2 =
+      base::FeatureList::IsEnabled(features::kWebUIPolymer2);
   html_source->AddResourcePath("crisper.js", IDR_MD_SETTINGS_CRISPER_JS);
   html_source->AddResourcePath("lazy_load.crisper.js",
                                IDR_MD_SETTINGS_LAZY_LOAD_CRISPER_JS);
-  html_source->AddResourcePath("lazy_load.html",
-                               IDR_MD_SETTINGS_LAZY_LOAD_VULCANIZED_HTML);
-  html_source->SetDefaultResource(IDR_MD_SETTINGS_VULCANIZED_HTML);
+  html_source->AddResourcePath(
+      "lazy_load.html", use_polymer_2
+                            ? IDR_MD_SETTINGS_LAZY_LOAD_VULCANIZED_P2_HTML
+                            : IDR_MD_SETTINGS_LAZY_LOAD_VULCANIZED_HTML);
+  html_source->SetDefaultResource(use_polymer_2
+                                      ? IDR_MD_SETTINGS_VULCANIZED_P2_HTML
+                                      : IDR_MD_SETTINGS_VULCANIZED_HTML);
   html_source->UseGzip(exclude_from_gzip);
 #else
   // Add all settings resources.
@@ -372,8 +379,7 @@
                                 html_source);
 }
 
-MdSettingsUI::~MdSettingsUI() {
-}
+MdSettingsUI::~MdSettingsUI() {}
 
 void MdSettingsUI::AddSettingsPageUIHandler(
     std::unique_ptr<content::WebUIMessageHandler> handler) {
diff --git a/chrome/chrome_cleaner/constants/BUILD.gn b/chrome/chrome_cleaner/constants/BUILD.gn
index cbd10bf..c446ae9 100644
--- a/chrome/chrome_cleaner/constants/BUILD.gn
+++ b/chrome/chrome_cleaner/constants/BUILD.gn
@@ -3,13 +3,14 @@
 # found in the LICENSE file.
 
 import("//build/config/chrome_build.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 
 declare_args() {
   reporter_branding_path = "REPORTER_BRANDING"
   cleaner_branding_path = "CLEANER_BRANDING"
   version_path = "VERSION"
-  lastchange_path = "//build/util/LASTCHANGE"
+  lastchange_path = lastchange_file
 }
 
 process_version("version_header") {
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 9a21e268..31fc219 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/buildflag_header.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//chrome/common/features.gni")
 import("//chrome/process_version_rc_template.gni")  # For branding_file_path.
@@ -39,7 +40,6 @@
     "ENABLE_BACKGROUND_CONTENTS=$enable_background_contents",
     "ENABLE_BASIC_PRINT_DIALOG=$enable_basic_print_dialog",
     "ENABLE_CAPTIVE_PORTAL_DETECTION=$enable_captive_portal_detection",
-    "ENABLE_GOOGLE_NOW=$enable_google_now",
     "ENABLE_HANGOUT_SERVICES_EXTENSION=$enable_hangout_services_extension",
     "ENABLE_ONE_CLICK_SIGNIN=$enable_one_click_signin",
     "ENABLE_NATIVE_NOTIFICATIONS=$enable_native_notifications",
@@ -505,10 +505,11 @@
   #visibility = [ ":*" ]
 
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
     branding_file_path,
+    lastchange_file,
   ]
+
   template_file = "chrome_version.h.in"
 
   output = "$target_gen_dir/chrome_version.h"
diff --git a/chrome/common/features.gni b/chrome/common/features.gni
index 3ab61c4..5bcbad3d 100644
--- a/chrome/common/features.gni
+++ b/chrome/common/features.gni
@@ -33,10 +33,6 @@
 
   enable_captive_portal_detection = !is_android && !is_chromecast
 
-  # Google Now is disabled to prepare for its removal.
-  # http://crbug.com/539674
-  enable_google_now = false
-
   # Hangout services is an extension that adds extra features to Hangouts.
   # It is enableable separately to facilitate testing.
   enable_hangout_services_extension = is_chrome_branded
@@ -81,7 +77,6 @@
   "enable_background_mode=$enable_background_mode",
   "enable_background_contents=$enable_background_contents",
   "enable_extensions=$enable_extensions",
-  "enable_google_now=$enable_google_now",
   "enable_hangout_services_extension=$enable_hangout_services_extension",
   "enable_plugins=$enable_plugins",
   "enable_print_preview=$enable_print_preview",
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn
index ca093fd..4ac4a30 100644
--- a/chrome/installer/linux/BUILD.gn
+++ b/chrome/installer/linux/BUILD.gn
@@ -7,6 +7,7 @@
 import("//build/config/features.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/sysroot.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//build/util/version.gni")
 import("//chrome/process_version_rc_template.gni")  # For branding_file_path.
@@ -328,9 +329,9 @@
   # Just output the default version info variables (no template).
   process_only = true
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
     branding_file_path,
+    lastchange_file,
   ]
   output = "$root_out_dir/installer/version.txt"
 }
diff --git a/chrome/process_version_rc_template.gni b/chrome/process_version_rc_template.gni
index 9259ac13..abe0a66 100644
--- a/chrome/process_version_rc_template.gni
+++ b/chrome/process_version_rc_template.gni
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/chrome_build.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 
 # The path to the BRANDING file in chrome/app/theme.
@@ -44,7 +45,7 @@
     _template_file = "//chrome/app/chrome_version.rc.version"
   }
   _sources = [
-    "//build/util/LASTCHANGE",
+    lastchange_file,
     "//chrome/VERSION",
     branding_file_path,
   ]
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn
index d1d3dc7..9e503444 100644
--- a/chrome/test/chromedriver/BUILD.gn
+++ b/chrome/test/chromedriver/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//build/config/python.gni")
 import("//build/config/ui.gni")
+import("//build/util/lastchange.gni")
 import("//testing/test.gni")
 
 action("embed_js_in_cpp") {
@@ -201,7 +202,7 @@
     # We don't actually use LASTCHANGE as an input file. It is updated
     # whenever a different Git revision is checked out, at which point
     # version.cc needs to be updated with the new revision info.
-    "//build/util/LASTCHANGE",
+    lastchange_file,
   ]
   outputs = [
     "$target_gen_dir/version.cc",
diff --git a/chrome/test/data/vr/webvr_info b/chrome/test/data/vr/webvr_info
deleted file mode 160000
index c58ae99..0000000
--- a/chrome/test/data/vr/webvr_info
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c58ae99b9ff9e2aa4c524633519570bf33536248
diff --git a/chrome/test/data/vr/webxr_samples b/chrome/test/data/vr/webxr_samples
deleted file mode 160000
index cf02f19..0000000
--- a/chrome/test/data/vr/webxr_samples
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit cf02f19c4ff6894705a9407722ab52551e010c60
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 99ac8b25..32b4b00b 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -15,6 +15,7 @@
 
 if (is_android) {
   import("//build/config/android/rules.gni")
+  import("//build/config/compiler/compiler.gni")
   import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
 }
 
@@ -55,6 +56,12 @@
 
   if (is_android) {
     enable_multidex = true
+
+    # The tracing unittests require this for testing unwinding. See
+    # stack_unwinder_android_unittest.cc.
+    if (can_unwind_with_cfi_table && is_official_build) {
+      add_unwind_tables_in_apk = true
+    }
   }
 
   # Add only ":unit_tests" dependencies here. If your tests have dependencies
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index b9d4b48..cac2f0a 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -6,6 +6,7 @@
 import("//build/buildflag_header.gni")
 import("//build/config/android/config.gni")
 import("//build/config/android/rules.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//build/util/version.gni")
 import("//testing/test.gni")
@@ -114,8 +115,8 @@
   _api_level = read_file("api_version.txt", "value")
   template_file = "api/src/org/chromium/net/ApiVersion.template"
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
+    lastchange_file,
   ]
   extra_args = [
     "-e",
@@ -144,8 +145,8 @@
   _api_level = read_file("api_version.txt", "value")
   template_file = "java/src/org/chromium/net/impl/ImplVersion.template"
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
+    lastchange_file,
   ]
   extra_args = [
     "-e",
@@ -1656,8 +1657,8 @@
   process_version("cronet_maven_build_embedded_copy") {
     template_file = "maven/test/build_embedded.gradle.template"
     sources = [
-      "//build/util/LASTCHANGE",
       "//chrome/VERSION",
+      lastchange_file,
     ]
     output = "$_maven_test_dir/test_embedded/build.gradle"
   }
@@ -1665,8 +1666,8 @@
   process_version("cronet_maven_build_fallback_copy") {
     template_file = "maven/test/build_fallback.gradle.template"
     sources = [
-      "//build/util/LASTCHANGE",
       "//chrome/VERSION",
+      lastchange_file,
     ]
     output = "$_maven_test_dir/test_fallback/build.gradle"
   }
@@ -1713,8 +1714,8 @@
     process_version(_pom_target_name) {
       template_file = "maven/$_module_name.pom.template"
       sources = [
-        "//build/util/LASTCHANGE",
         "//chrome/VERSION",
+        lastchange_file,
       ]
       output = "$_maven_modules_dir/$_module_name/$_maven_version/$_module_name-$_maven_version.pom"
     }
diff --git a/components/cronet/ios/BUILD.gn b/components/cronet/ios/BUILD.gn
index f7388c5..290f8ded 100644
--- a/components/cronet/ios/BUILD.gn
+++ b/components/cronet/ios/BUILD.gn
@@ -6,6 +6,7 @@
 import("//build/config/ios/rules.gni")
 import("//build/config/mac/symbols.gni")
 import("//build/mac/tweak_info_plist.gni")
+import("//build/util/lastchange.gni")
 import("//components/cronet/native/include/headers.gni")
 import("//components/grpc_support/include/headers.gni")
 import("//testing/test.gni")
@@ -289,7 +290,7 @@
 
     script = "//tools/licenses.py"
     inputs = [
-      "//build/util/LASTCHANGE",
+      lastchange_file,
     ]
     outputs = [
       _license_path,
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index eacebd3..7f148f86 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -67,6 +67,8 @@
     "migrate_sessions_on_network_change_v2";
 const char kQuicMaxTimeOnNonDefaultNetworkSeconds[] =
     "max_time_on_non_default_network_seconds";
+const char kQuicMaxMigrationsToNonDefaultNetworkOnWriteError[] =
+    "max_migrations_to_non_default_network_on_write_error";
 const char kQuicMaxMigrationsToNonDefaultNetworkOnPathDegrading[] =
     "max_migrations_to_non_default_network_on_path_degrading";
 const char kQuicUserAgentId[] = "user_agent_id";
@@ -329,6 +331,7 @@
 
       bool quic_migrate_sessions_on_network_change_v2 = false;
       int quic_max_time_on_non_default_network_seconds = 0;
+      int quic_max_migrations_to_non_default_network_on_write_error = 0;
       int quic_max_migrations_to_non_default_network_on_path_degrading = 0;
       if (quic_args->GetBoolean(kQuicMigrateSessionsOnNetworkChangeV2,
                                 &quic_migrate_sessions_on_network_change_v2)) {
@@ -342,6 +345,13 @@
                   quic_max_time_on_non_default_network_seconds);
         }
         if (quic_args->GetInteger(
+                kQuicMaxMigrationsToNonDefaultNetworkOnWriteError,
+                &quic_max_migrations_to_non_default_network_on_write_error)) {
+          session_params
+              ->quic_max_migrations_to_non_default_network_on_write_error =
+              quic_max_migrations_to_non_default_network_on_write_error;
+        }
+        if (quic_args->GetInteger(
                 kQuicMaxMigrationsToNonDefaultNetworkOnPathDegrading,
                 &quic_max_migrations_to_non_default_network_on_path_degrading)) {
           session_params
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index f045720e3..96752a90 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -394,6 +394,7 @@
       "{\"QUIC\":{\"migrate_sessions_on_network_change_v2\":true,"
       "\"migrate_sessions_early_v2\":true,"
       "\"max_time_on_non_default_network_seconds\":10,"
+      "\"max_migrations_to_non_default_network_on_write_error\":3,"
       "\"max_migrations_to_non_default_network_on_path_degrading\":4}}",
       // MockCertVerifier to use for testing purposes.
       std::unique_ptr<net::CertVerifier>(),
@@ -417,6 +418,8 @@
   EXPECT_TRUE(params->quic_migrate_sessions_early_v2);
   EXPECT_EQ(base::TimeDelta::FromSeconds(10),
             params->quic_max_time_on_non_default_network);
+  EXPECT_EQ(3,
+            params->quic_max_migrations_to_non_default_network_on_write_error);
   EXPECT_EQ(
       4, params->quic_max_migrations_to_non_default_network_on_path_degrading);
 }
diff --git a/components/mirroring/browser/cast_remoting_sender_unittest.cc b/components/mirroring/browser/cast_remoting_sender_unittest.cc
index 4a18c55..01b9c3f7 100644
--- a/components/mirroring/browser/cast_remoting_sender_unittest.cc
+++ b/components/mirroring/browser/cast_remoting_sender_unittest.cc
@@ -178,9 +178,9 @@
            MOJO_RESULT_OK;
   }
 
-  void PostMojoCallTask_SendFrame(uint32_t size) { sender_->SendFrame(size); }
+  void SendFrame(uint32_t size) { remoting_sender_->SendFrame(size); }
 
-  void PostMojoCallTask_CancelInFlightData() { sender_->CancelInFlightData(); }
+  void CancelInFlightData() { remoting_sender_->CancelInFlightData(); }
 
   void TakeSentFrames(std::vector<media::cast::EncodedFrame>* frames) {
     transport_.TakeSentFrames(frames);
@@ -271,17 +271,17 @@
   DISALLOW_COPY_AND_ASSIGN(CastRemotingSenderTest);
 };
 
-TEST_F(CastRemotingSenderTest, SendsFramesViaMojoInterface) {
+TEST_F(CastRemotingSenderTest, SendsFramesViaMojoDataPipe) {
   // One 256-byte chunk pushed through the data pipe to make one frame.
   ASSERT_TRUE(ProduceDataChunk(0, 256));
-  PostMojoCallTask_SendFrame(256);
+  SendFrame(256);
   RunPendingTasks();
   EXPECT_TRUE(ExpectOneFrameWasSent(256));
   AckOldestInFlightFrames(1);
   EXPECT_EQ(media::cast::FrameId::first(), latest_acked_frame_id());
 
   // Four 256-byte chunks pushed through the data pipe to make one frame.
-  PostMojoCallTask_SendFrame(1024);
+  SendFrame(1024);
   for (int i = 0; i < 4; ++i) {
     ASSERT_TRUE(ProduceDataChunk(i * 256, 256));
   }
@@ -292,7 +292,7 @@
 
   // 10 differently-sized chunks pushed through the data pipe to make one frame
   // that is larger than the data pipe's total capacity.
-  PostMojoCallTask_SendFrame(6665);
+  SendFrame(6665);
   size_t offset = 0;
   for (int i = 0; i < 10; ++i) {
     const size_t chunk_size = 500 + i * 37;
@@ -310,7 +310,7 @@
   // Send 4 frames.
   for (int i = 0; i < 4; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 16));
-    PostMojoCallTask_SendFrame(16);
+    SendFrame(16);
   }
   RunPendingTasks();
   EXPECT_EQ(4, NumberOfFramesInFlight());
@@ -335,7 +335,7 @@
   // Send first frame and don't Ack it. Expect the first frame to be
   // kickstarted.
   ASSERT_TRUE(ProduceDataChunk(0, 16));
-  PostMojoCallTask_SendFrame(16);
+  SendFrame(16);
   EXPECT_EQ(media::cast::FrameId::first(), WaitForKickstart());
   EXPECT_EQ(1, NumberOfFramesInFlight());
 
@@ -343,7 +343,7 @@
   // kickstarted.
   for (int i = 0; i < 3; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 16));
-    PostMojoCallTask_SendFrame(16);
+    SendFrame(16);
   }
   EXPECT_EQ(media::cast::FrameId::first() + 3, WaitForKickstart());
   EXPECT_EQ(4, NumberOfFramesInFlight());
@@ -359,20 +359,17 @@
 }
 
 TEST_F(CastRemotingSenderTest, CancelsUnsentFrame) {
-  PostMojoCallTask_SendFrame(16);
-  PostMojoCallTask_SendFrame(32);
-  PostMojoCallTask_CancelInFlightData();
   EXPECT_EQ(0u, GetSizeOfNextFrameData());
+  SendFrame(16);
+  SendFrame(32);
+  CancelInFlightData();
+  RunPendingTasks();
+
+  // Provide the data. Both frames should not be sent out.
   ASSERT_TRUE(ProduceDataChunk(0, 16));
   RunPendingTasks();
-  // The first frame's data should have been read from the data pipe.
-  EXPECT_EQ(16u, GetSizeOfNextFrameData());
-  EXPECT_EQ(0, NumberOfFramesInFlight());
   ASSERT_TRUE(ProduceDataChunk(0, 32));
   RunPendingTasks();
-  // The |next_frame_data_| was not updated because the second frame data was
-  // discarded from the data pipe.
-  EXPECT_EQ(16u, GetSizeOfNextFrameData());
   EXPECT_EQ(0, NumberOfFramesInFlight());
 
   // Since no frames were sent, none should have been passed to the
@@ -391,7 +388,7 @@
   // Send 10 frames.
   for (int i = 0; i < 10; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 16));
-    PostMojoCallTask_SendFrame(16);
+    SendFrame(16);
   }
   RunPendingTasks();
   EXPECT_FALSE(IsFlowRestartPending());
@@ -406,7 +403,7 @@
 
   // Cancel all in-flight data. This should cause the remaining 9 frames to be
   // canceled.
-  PostMojoCallTask_CancelInFlightData();
+  CancelInFlightData();
   RunPendingTasks();
   EXPECT_TRUE(IsFlowRestartPending());
   EXPECT_EQ(0, NumberOfFramesInFlight());
@@ -415,7 +412,7 @@
 
   // Send one more frame and ack it.
   ASSERT_TRUE(ProduceDataChunk(0, 16));
-  PostMojoCallTask_SendFrame(16);
+  SendFrame(16);
   RunPendingTasks();
   EXPECT_FALSE(IsFlowRestartPending());
   EXPECT_EQ(1, NumberOfFramesInFlight());
@@ -441,7 +438,7 @@
   // Queue up and issue Mojo calls to consume three frames. Since no data has
   // been pushed into the pipe yet no frames should be sent.
   for (int i = 0; i < 3; ++i) {
-    PostMojoCallTask_SendFrame(4);
+    SendFrame(4);
   }
   RunPendingTasks();
   EXPECT_TRUE(IsFlowRestartPending());
@@ -468,13 +465,13 @@
   // frames. Since no data has been pushed into the pipe yet no frames should be
   // sent.
   for (int i = 0; i < 3; ++i) {
-    PostMojoCallTask_SendFrame(4);
+    SendFrame(4);
   }
   RunPendingTasks();
   EXPECT_EQ(0, NumberOfFramesInFlight());
 
   // Cancel all in-flight data.
-  PostMojoCallTask_CancelInFlightData();
+  CancelInFlightData();
   RunPendingTasks();
 
   // Now, push the data for one frame into the data pipe. Because of the
@@ -493,7 +490,7 @@
   // Now issue calls to send another frame and then push the data for it into
   // the data pipe. Expect to see the frame gets sent since it was provided
   // after the CancelInFlightData().
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(0, NumberOfFramesInFlight());
   ASSERT_TRUE(ProduceDataChunk(0, 4));
@@ -508,7 +505,7 @@
   // yet.
   for (int i = 0; i < media::cast::kMaxUnackedFrames; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 4));
-    PostMojoCallTask_SendFrame(4);
+    SendFrame(4);
   }
   RunPendingTasks();
   EXPECT_FALSE(IsFlowRestartPending());
@@ -521,7 +518,7 @@
   // queuing input operations instead of sending the the frame to the
   // CastTransport.
   ASSERT_TRUE(ProduceDataChunk(0, 4));
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(media::cast::kMaxUnackedFrames, NumberOfFramesInFlight());
   // Note: The unsent frame resides in CastRemotingSender's single-frame data
@@ -539,7 +536,7 @@
   // Attempting to send another frame will once again cause CastRemotingSender
   // to queue input operations.
   ASSERT_TRUE(ProduceDataChunk(0, 4));
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(media::cast::kMaxUnackedFrames, NumberOfFramesInFlight());
   // Note: Once again, CastRemotingSender's single-frame data buffer contains an
@@ -553,7 +550,7 @@
   int num_frames_in_data_pipe = 0;
   while (ProduceDataChunk(0, 768)) {
     ++num_frames_in_data_pipe;
-    PostMojoCallTask_SendFrame(768);
+    SendFrame(768);
     RunPendingTasks();
     EXPECT_EQ(media::cast::kMaxUnackedFrames, NumberOfFramesInFlight());
     // Note: CastRemotingSender's single-frame data buffer should still contain
@@ -586,7 +583,7 @@
   EXPECT_EQ(1, NumberOfFramesInFlight());
   // ..and one more frame can be sent immediately.
   ASSERT_TRUE(ProduceDataChunk(0, 4));
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(2, NumberOfFramesInFlight());
   // ...and ack these last two frames.
diff --git a/components/mirroring/service/remoting_sender_unittest.cc b/components/mirroring/service/remoting_sender_unittest.cc
index 0c61f9d9..016c090 100644
--- a/components/mirroring/service/remoting_sender_unittest.cc
+++ b/components/mirroring/service/remoting_sender_unittest.cc
@@ -178,9 +178,9 @@
            MOJO_RESULT_OK;
   }
 
-  void PostMojoCallTask_SendFrame(uint32_t size) { sender_->SendFrame(size); }
+  void SendFrame(uint32_t size) { remoting_sender_->SendFrame(size); }
 
-  void PostMojoCallTask_CancelInFlightData() { sender_->CancelInFlightData(); }
+  void CancelInFlightData() { remoting_sender_->CancelInFlightData(); }
 
   void TakeSentFrames(std::vector<media::cast::EncodedFrame>* frames) {
     transport_.TakeSentFrames(frames);
@@ -261,17 +261,17 @@
   DISALLOW_COPY_AND_ASSIGN(RemotingSenderTest);
 };
 
-TEST_F(RemotingSenderTest, SendsFramesViaMojoInterface) {
+TEST_F(RemotingSenderTest, SendsFramesViaMojoDataPipe) {
   // One 256-byte chunk pushed through the data pipe to make one frame.
   ASSERT_TRUE(ProduceDataChunk(0, 256));
-  PostMojoCallTask_SendFrame(256);
+  SendFrame(256);
   RunPendingTasks();
   EXPECT_TRUE(ExpectOneFrameWasSent(256));
   AckOldestInFlightFrames(1);
   EXPECT_EQ(media::cast::FrameId::first(), latest_acked_frame_id());
 
   // Four 256-byte chunks pushed through the data pipe to make one frame.
-  PostMojoCallTask_SendFrame(1024);
+  SendFrame(1024);
   for (int i = 0; i < 4; ++i) {
     ASSERT_TRUE(ProduceDataChunk(i * 256, 256));
   }
@@ -282,7 +282,7 @@
 
   // 10 differently-sized chunks pushed through the data pipe to make one frame
   // that is larger than the data pipe's total capacity.
-  PostMojoCallTask_SendFrame(6665);
+  SendFrame(6665);
   size_t offset = 0;
   for (int i = 0; i < 10; ++i) {
     const size_t chunk_size = 500 + i * 37;
@@ -300,7 +300,7 @@
   // Send 4 frames.
   for (int i = 0; i < 4; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 16));
-    PostMojoCallTask_SendFrame(16);
+    SendFrame(16);
   }
   RunPendingTasks();
   EXPECT_EQ(4, NumberOfFramesInFlight());
@@ -323,7 +323,7 @@
   // Send first frame and don't Ack it. Expect the first frame to be
   // kickstarted.
   ASSERT_TRUE(ProduceDataChunk(0, 16));
-  PostMojoCallTask_SendFrame(16);
+  SendFrame(16);
   EXPECT_EQ(media::cast::FrameId::first(), WaitForKickstart());
   EXPECT_EQ(1, NumberOfFramesInFlight());
 
@@ -331,7 +331,7 @@
   // kickstarted.
   for (int i = 0; i < 3; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 16));
-    PostMojoCallTask_SendFrame(16);
+    SendFrame(16);
   }
   EXPECT_EQ(media::cast::FrameId::first() + 3, WaitForKickstart());
   EXPECT_EQ(4, NumberOfFramesInFlight());
@@ -344,20 +344,16 @@
 }
 
 TEST_F(RemotingSenderTest, CancelsUnsentFrame) {
-  PostMojoCallTask_SendFrame(16);
-  PostMojoCallTask_SendFrame(32);
-  PostMojoCallTask_CancelInFlightData();
   EXPECT_EQ(0u, GetSizeOfNextFrameData());
+  SendFrame(16);
+  SendFrame(32);
+  CancelInFlightData();
+
+  // Provide the data. Both frames should not be sent out.
   ASSERT_TRUE(ProduceDataChunk(0, 16));
   RunPendingTasks();
-  // The first frame's data should have been read from the data pipe.
-  EXPECT_EQ(16u, GetSizeOfNextFrameData());
-  EXPECT_EQ(0, NumberOfFramesInFlight());
   ASSERT_TRUE(ProduceDataChunk(0, 32));
   RunPendingTasks();
-  // The |next_frame_data_| was not updated because the second frame data was
-  // discarded from the data pipe.
-  EXPECT_EQ(16u, GetSizeOfNextFrameData());
   EXPECT_EQ(0, NumberOfFramesInFlight());
 
   // Since no frames were sent, none should have been passed to the
@@ -376,7 +372,7 @@
   // Send 10 frames.
   for (int i = 0; i < 10; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 16));
-    PostMojoCallTask_SendFrame(16);
+    SendFrame(16);
   }
   RunPendingTasks();
   EXPECT_FALSE(IsFlowRestartPending());
@@ -391,7 +387,7 @@
 
   // Cancel all in-flight data. This should cause the remaining 9 frames to be
   // canceled.
-  PostMojoCallTask_CancelInFlightData();
+  CancelInFlightData();
   RunPendingTasks();
   EXPECT_TRUE(IsFlowRestartPending());
   EXPECT_EQ(0, NumberOfFramesInFlight());
@@ -400,7 +396,7 @@
 
   // Send one more frame and ack it.
   ASSERT_TRUE(ProduceDataChunk(0, 16));
-  PostMojoCallTask_SendFrame(16);
+  SendFrame(16);
   RunPendingTasks();
   EXPECT_FALSE(IsFlowRestartPending());
   EXPECT_EQ(1, NumberOfFramesInFlight());
@@ -426,7 +422,7 @@
   // Queue up and issue Mojo calls to consume three frames. Since no data has
   // been pushed into the pipe yet no frames should be sent.
   for (int i = 0; i < 3; ++i) {
-    PostMojoCallTask_SendFrame(4);
+    SendFrame(4);
   }
   RunPendingTasks();
   EXPECT_TRUE(IsFlowRestartPending());
@@ -453,13 +449,13 @@
   // frames. Since no data has been pushed into the pipe yet no frames should be
   // sent.
   for (int i = 0; i < 3; ++i) {
-    PostMojoCallTask_SendFrame(4);
+    SendFrame(4);
   }
   RunPendingTasks();
   EXPECT_EQ(0, NumberOfFramesInFlight());
 
   // Cancel all in-flight data.
-  PostMojoCallTask_CancelInFlightData();
+  CancelInFlightData();
   RunPendingTasks();
 
   // Now, push the data for one frame into the data pipe. Because of the
@@ -478,7 +474,7 @@
   // Now issue calls to send another frame and then push the data for it into
   // the data pipe. Expect to see the frame gets sent since it was provided
   // after the CancelInFlightData().
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(0, NumberOfFramesInFlight());
   ASSERT_TRUE(ProduceDataChunk(0, 4));
@@ -493,7 +489,7 @@
   // yet.
   for (int i = 0; i < media::cast::kMaxUnackedFrames; ++i) {
     ASSERT_TRUE(ProduceDataChunk(0, 4));
-    PostMojoCallTask_SendFrame(4);
+    SendFrame(4);
   }
   RunPendingTasks();
   EXPECT_FALSE(IsFlowRestartPending());
@@ -506,7 +502,7 @@
   // queuing input operations instead of sending the the frame to the
   // CastTransport.
   ASSERT_TRUE(ProduceDataChunk(0, 4));
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(media::cast::kMaxUnackedFrames, NumberOfFramesInFlight());
   // Note: The unsent frame resides in CastRemotingSender's single-frame data
@@ -524,7 +520,7 @@
   // Attempting to send another frame will once again cause CastRemotingSender
   // to queue input operations.
   ASSERT_TRUE(ProduceDataChunk(0, 4));
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(media::cast::kMaxUnackedFrames, NumberOfFramesInFlight());
   // Note: Once again, CastRemotingSender's single-frame data buffer contains an
@@ -538,7 +534,7 @@
   int num_frames_in_data_pipe = 0;
   while (ProduceDataChunk(0, 768)) {
     ++num_frames_in_data_pipe;
-    PostMojoCallTask_SendFrame(768);
+    SendFrame(768);
     RunPendingTasks();
     EXPECT_EQ(media::cast::kMaxUnackedFrames, NumberOfFramesInFlight());
     // Note: CastRemotingSender's single-frame data buffer should still contain
@@ -571,7 +567,7 @@
   EXPECT_EQ(1, NumberOfFramesInFlight());
   // ..and one more frame can be sent immediately.
   ASSERT_TRUE(ProduceDataChunk(0, 4));
-  PostMojoCallTask_SendFrame(4);
+  SendFrame(4);
   RunPendingTasks();
   EXPECT_EQ(2, NumberOfFramesInFlight());
   // ...and ack these last two frames.
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
index 39fd430..06b5425 100644
--- a/components/network_session_configurator/browser/network_session_configurator.cc
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
@@ -295,6 +295,19 @@
   return 0;
 }
 
+int GetQuicMaxNumMigrationsToNonDefaultNetworkOnWriteError(
+    const VariationParameters& quic_trial_params) {
+  int value;
+  if (base::StringToInt(
+          GetVariationParam(
+              quic_trial_params,
+              "max_migrations_to_non_default_network_on_write_error"),
+          &value)) {
+    return value;
+  }
+  return 0;
+}
+
 int GetQuicMaxNumMigrationsToNonDefaultNetworkOnPathDegrading(
     const VariationParameters& quic_trial_params) {
   int value;
@@ -415,6 +428,13 @@
       params->quic_max_time_on_non_default_network =
           base::TimeDelta::FromSeconds(max_time_on_non_default_network_seconds);
     }
+    int max_migrations_to_non_default_network_on_write_error =
+        GetQuicMaxNumMigrationsToNonDefaultNetworkOnWriteError(
+            quic_trial_params);
+    if (max_migrations_to_non_default_network_on_write_error > 0) {
+      params->quic_max_migrations_to_non_default_network_on_write_error =
+          max_migrations_to_non_default_network_on_write_error;
+    }
     int max_migrations_to_non_default_network_on_path_degrading =
         GetQuicMaxNumMigrationsToNonDefaultNetworkOnPathDegrading(
             quic_trial_params);
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
index 6235f7d9..c078375 100644
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -358,8 +358,24 @@
             params_.quic_max_time_on_non_default_network);
 }
 
-TEST_F(NetworkSessionConfiguratorTest,
-       QuicMaxNumMigrationsToNonDefaultNetworkFromFieldTrialParams) {
+TEST_F(
+    NetworkSessionConfiguratorTest,
+    QuicMaxNumMigrationsToNonDefaultNetworkOnWriteErrorFromFieldTrialParams) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["max_migrations_to_non_default_network_on_write_error"] =
+      "3";
+  variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  EXPECT_EQ(3,
+            params_.quic_max_migrations_to_non_default_network_on_write_error);
+}
+
+TEST_F(
+    NetworkSessionConfiguratorTest,
+    QuicMaxNumMigrationsToNonDefaultNetworkOnPathDegradingFromFieldTrialParams) {
   std::map<std::string, std::string> field_trial_params;
   field_trial_params
       ["max_migrations_to_non_default_network_on_path_degrading"] = "4";
diff --git a/components/offline_pages/core/offline_page_archiver.cc b/components/offline_pages/core/offline_page_archiver.cc
index 90cf1f1..231fe1f 100644
--- a/components/offline_pages/core/offline_page_archiver.cc
+++ b/components/offline_pages/core/offline_page_archiver.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task_runner_util.h"
 #include "components/offline_pages/core/model/offline_page_model_taskified.h"
@@ -40,6 +41,16 @@
       offline_pages::model_utils::GenerateUniqueFilenameForOfflinePage(
           offline_page.title, offline_page.url, publish_directory);
 
+  // Create the destination directory if it does not already exist.
+  if (!publish_directory.empty() && !base::DirectoryExists(publish_directory)) {
+    base::File::Error file_error;
+    if (!base::CreateDirectoryAndGetError(publish_directory, &file_error)) {
+      UMA_HISTOGRAM_ENUMERATION(
+          "OfflinePages.PublishArchive.CreateDirectoryError", -file_error,
+          -base::File::Error::FILE_ERROR_MAX);
+    }
+  }
+
   // Move the file.
   bool moved = base::Move(offline_page.file_path, new_file_path);
   if (!moved) {
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index cdfacea5..20fd000 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -297,6 +297,11 @@
       አንድ ቅንብር ሳይገለጽ ከተተወ ነባሪው ዋጋ ስራ ላይ ይውላል።
 
       ይህ መመሪያ እንዳልተዋቀረ ከተተወ ነባሪዎቹ ለሁሉም ቅንብሮች ስራ ላይ ይውላሉ።</translation>
+<translation id="1958138414749279167">የ<ph name="PRODUCT_NAME" /> ራስ-ሙላ ባህሪን ያነቃል፣ እና ተጠቃሚዎች ከዚህ ቀደም የተከማቸ መረጃን በመጠቀም የአድራሻ መረጃን በድር ቅጾች ላይ በራስ-እንዲያጠናቅቁ ያስችላቸዋል።
+
+      ይህ ቅንብር ከተሰናከለ ራስ-ሙላ በጭራሽ የአድራሻ መረጃን አይጠቁምም ወይም አይሞላም፣ እንዲሁም ተጠቃሚው ድሩን እያሰሰ ሳለ ሊያስገባ የሚችለውን የክሬዲት ካርድ መረጃን አያስቀምጥም።
+
+      ይህን ቅንብር ከነቃ ወይም እሴት ከሌለው ተጠቃሚው በዩአይ ውስጥ ለአድራሻ ራስ-ሙላን መቆጣጠር ይችላል።</translation>
 <translation id="1960840544413786116">የsubjectAlternativeName ቅጥያ በሚጎድላቸው የአካባቢያዊ እምነት መልሕቆች የተሰጡ የእውቅና ማረጋገጫዎች የሚታመኑ ወይም የማይታመኑ እንደሆኑ</translation>
 <translation id="1964634611280150550">ማንነት የማያሳውቅ ሁነታ ተሰናክሏል</translation>
 <translation id="1964802606569741174">ይህ መመሪያ በAndroid YouTube መተግበሪያው ላይ ምንም ተጽዕኖ የለውም። በYouTube ላይ የጥንቃቄ ሁነታ ተፈጻሚ የሚሆን ከሆነ የAndroid YouTube መተግበሪያ መጫን መከልከል አለበት።</translation>
@@ -1913,6 +1918,7 @@
 <translation id="6440051664870270040">ጣቢያዎች ብቅ-ባዮችን በአንድ ላይ እንዲያስሱ እና እንዲከፍቱ ይፍቀዱ</translation>
 <translation id="6447948611083700881">ምትኬ እና ወደነበረበት መመለስ ተሰናክሏል</translation>
 <translation id="645425387487868471">ለ<ph name="PRODUCT_NAME" /> በግዳጅ በመለያ መግባትን ያንቁ</translation>
+<translation id="6464074037294098618">ለአድራሻዎች ራስ-ሙላን ያንቁ</translation>
 <translation id="6473623140202114570">የጥንቃቄ አሰሳስ ማስጠንቀቂያዎችን የማይቀሰቅስባቸው የጎራዎች ዝርዝርን ያዋቅሩ።</translation>
 <translation id="6491139795995924304">በመሣሪያው ላይ ብሉቱዝ ፍቀድ</translation>
 <translation id="6520802717075138474">የመጀመሪያው አሂድ ላይ የፍለጋ ፕሮግራሞችን ከነባሪው አሳሽ ያስመጣል</translation>
@@ -2260,15 +2266,6 @@
 
 ይህ ቅንብር ከተሰናከለ፣ ይህ ባህሪይ እይገኝም።</translation>
 <translation id="7275334191706090484">የተዳደሩ እልባቶች</translation>
-<translation id="729492886167634859">ይህ መመሪያ ዝማኔው መጀመሪያ ከተገኘበት ቀን ጀምሮ በየሳምንቱ የሚዘመኑ በOU ውስጥ ያሉ የ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች ክፍልፋይ የሚገልጽ የመቶኛዎች ዝርዝርን ይገልጻል። መሣሪያው ዝማኔዎች ካሉ እስኪፈትሽ ድረስ ዝማኔው ከታተመ በኋላ ጊዜ ሊወስድ ስለሚችል የግኝት ጊዜው ዝማኔው ከታተመበት ጊዜ በኋላ ነው።
-
-      በዝርዝሩ ውስጥ ያለው n-ኛ እሴት ዝማኔው ከተገኘ በኋላ እስከ n-ኛ ሳምንት ውስጥ ባለው ጊዜ ውስጥ ወደ ቀጣዩ ስሪት አዘምነው መጨረስ ያለባቸው የመሣሪያዎች መቶኛ እንደሆነ ተደርጎ ስራ ላይ ይውላል። ለምሳሌ፣ አንድ ዝማኔ ዛሬ ቢገኝ በዝርዝሩ ውስጥ ያለው የመጀመሪያው እሴት ከዛሬ ጀምሮ በየሳምንቱ ወደዚያ ስሪት መዘመን ያለባቸውን በOU ውስጥ ያሉ መሣሪያዎች መቶኛን ይገልጻል። ሁለተኛው እሴት ከዛሬ ጀምሮ በ2 ሳምንታት ውስጥ ወደዚያ ስሪት መዘመን ያለባቸውን በOU ውስጥ ያሉ መሣሪያዎችን መቶኛን ይገልጻል፣ ወዘተ ማለት ነው።
-
-      ለዚህ መመሪያ የተገለጸ እሴት ካለ ዝማኔዎች የ<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> መመሪያውን ችላ ይሉትና በምትኩ ይህን መመሪያ ይከተሉታል።
-
-      ይህ ዝርዝር ባዶ ከሆነ ምንም የታቀደ ልቀት አይኖርም፣ እንዲሁም ዝማኔዎች በሌሎች የመሣሪያው መመሪያዎች መሠረት ይተገበራሉ።
-
-      ይህ መመሪያ ለሰርጥ መቀያየሮችን አይመለከተውም።</translation>
 <translation id="7295019613773647480">ክትትል የሚደረግባቸው ተጠቃሚዎችን ያንቁ</translation>
 <translation id="7301543427086558500">የፍለጋ ቃላትን ከፍለጋ ፕሮግራሙ ለማውጣት ሊያገለግሉ የተለዋጭ ዩ አር ኤሎች ዝርዝርን ይገልጻል። ዩ አር ኤሎቹ ሕብረቁምፊው <ph name="SEARCH_TERM_MARKER" /> ሊኖራቸው ይገባል፣ ይህም የፍለጋ ቃላቱን ለማውጣት ሊያገለግል ይችላል።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index 659e177..b6b82e2 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -2141,15 +2141,6 @@
 
           عند إيقاف هذا الإعداد، لن تصبح هذه الميزة متاحة.</translation>
 <translation id="7275334191706090484">الإشارات المرجعية المُدارة</translation>
-<translation id="729492886167634859">‏تُحدِّد هذه السياسة قائمة بالنسب المئوية التي ستحدد الجزء من أجهزة <ph name="PRODUCT_OS_NAME" /> في الوحدة التنظيمية لتحديثها كل أسبوع بدءًا من اليوم الذي يتم فيه اكتشاف التحديث لأول مرة. وسيكون وقت الاكتشاف أحدث من وقت التحديث المنشور، حيث من الممكن أن يستغرق الأمر بعض الوقت بعد نشر التحديث حتى يبحث الجهاز عن التحديثات.
-
-      سيتم استخدام القيمة رقم N في القائمة كنسبة مئوية من الأجهزة التي يجب أن تستكمل التحديث إلى الإصدار التالي في الأسبوع رقم N بعد اكتشاف التحديث. على سبيل المثال، إذا تم اكتشاف أحد التحديثات اليوم، حينئذٍ تحدد القيمة الأولى في القائمة النسبة المئوية للأجهزة في الوحدة التنظيمية التي يجب تحديثها إلى هذا الإصدار بعد أسبوع ابتداءً من اليوم. أما القيمة الثانية تُحدِّد النسبة المئوية للأجهزة في الوحدة التنظيمية التي يجب تحديثها إلى هذا الإصدار بعد أسبوعين ابتداءً من اليوم، وما إلى ذلك.
-
-      إذا كانت هناك قيمة مُحدَّدة لهذه السياسة، ستتجاهل التحديثات سياسة <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> وتتَّبع هذه السياسة بدلاً من ذلك.
-
-      إذا كانت هذه القائمة فارغة، لن تتوفَّر أي مراحل وسيتم تطبيق التحديثات وفقًا لسياسات الجهاز الأخرى.
-
-      لا تنطبق تلك السياسة على تطبيقات مفاتيح القنوات.</translation>
 <translation id="7295019613773647480">تفعيل المستخدمين الخاضعين للإشراف</translation>
 <translation id="7301543427086558500">‏تحديد قائمة بعناوين URL البديلة التي يمكن استخدامها لاستخراج عبارات البحث من محرك البحث. يجب أن تشتمل عناوين URL على سلسلة <ph name="SEARCH_TERM_MARKER" />، التي سيتم استخدامها في استخراج عبارات البحث.
 
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 2fb1ce0a..1ebddb4 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -2176,15 +2176,6 @@
 
 В случай че настройката е деактивирана, функцията няма да е налице.</translation>
 <translation id="7275334191706090484">Управлявани отметки</translation>
-<translation id="729492886167634859">Това правило служи за съставяне на списък с процентни стойности, указващи каква част от устройствата с <ph name="PRODUCT_OS_NAME" /> в ОЕ да бъдат актуализирани на седмица, като се започва от деня на първото откриване на актуализацията. Моментът на откриването е по-късен от този на публикуване на актуализацията, тъй като е възможно да измине известно време след публикуването, докато устройството провери за актуализации.
-
-Стойността с пореден номер n в списъка ще указва какъв процент устройства да бъдат актуализирани до следващата версия през n-тата седмица след откриване на актуализацията. Ако например тя е открита днес, първата стойност в списъка посочва процента устройства в ОЕ, които да се актуализират до съответната версия след една седмица. Втората стойност указва процента, който да бъде актуализиран след 2 седмици, и т.н.
-
-Ако за това правило е зададена стойност, актуализациите ще са съобразени с него и правилото <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ще бъде пренебрегнато.
-
-В случай че списъкът е празен, актуализациите няма да се инсталират поетапно, а ще бъдат прилагани според другите правила за устройства.
-
-Това правило не е приложимо при промяна на канала.</translation>
 <translation id="7295019613773647480">Активиране на контролирани потребители</translation>
 <translation id="7301543427086558500">Посочва списък с алтернативни URL адреси, които могат да се използват за извличане на думи за търсене от търсещата машина. Тези адреси трябва да съдържат низа <ph name="SEARCH_TERM_MARKER" />, който ще се ползва при извличането.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 5b3b2f4..5945396 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -2623,15 +2623,6 @@
       আপনি এই সেটিংটি অক্ষম করলে, ব্যবহারকারীদেরকে Smart Lock ব্যবহার করতে দেওয়া হবে না।
      
 এই নীতি সেট না করে রাখা হলে, এন্টারপ্রাইজ-পরিচালিত ব্যবহারকারীদের জন্য ডিফল্টের অনুমতি দেওয়া হয় না এবং অ-পরিচালিত ব্যবহারকারীদের জন্য অনুমতি দেওয়া হয়।</translation>
-<translation id="729492886167634859">আপডেটটি প্রথম যখন খুঁজে পাওয়া যাবে, সেদিন থেকে শুরু করে প্রতি সপ্তাহে OU-এর যতগুলি <ph name="PRODUCT_OS_NAME" /> ডিভাইস আপডেট করতে হবে, তার শতকরা হারের একটি তালিকা এই নীতিতে নির্দিষ্ট করা থাকে। আপডেট দেখার সময়টি আপডেট প্রকাশিত হওয়ার সময়ের পরে আসে, কারণ প্রকাশ করার বেশ কিছুক্ষণ বা কিছু দিন পরে ডিভাইসটি আপডেট খুঁজতে পারে।
-
-      কত শতাংশ ডিভাইসে পরবর্তী ভার্সনে আপডেট করার কাজটি আপডেট খুঁজে পাওয়ার পরে n সংখ্যক সপ্তাহের মধ্যে করতে হবে, সেটি তালিকার n মান হিসেবে উল্লেখ করা থাকে। যেমন, আজ যদি একটি আপডেট খুঁজে পাওয়া যায় তাহলে আজ থেকে এক সপ্তাহের মধ্যে OU-এর যত শতাংশ ডিভাইস সেই ভার্সনে আপডেট করতে হবে, সেটি তালিকার প্রথম মান হিসেবে উল্লেখ করা থাকবে। OU-এর যত শতাংশ ডিভাইস আজ থেকে ২ সপ্তাহের মধ্যে সেই ভার্সনে আপডেট করতে হবে, সেটি দ্বিতীয় মান হিসেবে উল্লেখ করা থাকবে।
-
-      এই নীতির জন্য যদি কোনও মান উল্লেখ করা থাকে তাহলে আপডেটগুলি <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> নীতির বদলে এটি অনুসরণ করবে।
-
-      এই তালিকাটি যদি খালি থাকে তাহলে স্টেজিং করা হবে না এবং আপডেটগুলি ডিভাইসের অন্যান্য নীতি অনুযায়ী প্রয়োগ করা হবে।
-
-      চ্যানেল পরিবর্তনের ক্ষেত্রে এই নীতিটি প্রযোজ্য নয়।</translation>
 <translation id="7295019613773647480">তত্ত্বাবধানে থাকা ব্যবহারকারীদের সক্ষম করুন</translation>
 <translation id="7301543427086558500">পরিবর্ত URLগুলির একটি তালিকা নির্দিষ্ট করে যা সার্চ ইঞ্জিন থেকে সার্চ শব্দগুলি বের করে আনতে ব্যবহার করা হয়৷ URLগুলিতে <ph name="SEARCH_TERM_MARKER" /> স্ট্রিং থাকা উচিত, যা সার্চ শব্দগুলি বের করে আনতে ব্যবহার করা হবে৷
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index dd4b1f3..d4c557e 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -2157,15 +2157,6 @@
 
           Si aquesta configuració està desactivada, aquesta funció no estarà disponible.</translation>
 <translation id="7275334191706090484">Adreces d'interès gestionades</translation>
-<translation id="729492886167634859">Aquesta política defineix una llista de percentatges que definiran quina part dels dispositius <ph name="PRODUCT_OS_NAME" /> a l'UO cal actualitzar cada setmana a partir del dia en què l'actualització es detecti per primer cop. El moment de detecció és posterior al de publicació, ja que podria passar una estona entre que es publica l'actualització i el dispositiu cerca actualitzacions.
-
-      L'enèsim valor de la llista s'utilitzarà com el percentatge de dispositius que han de completar l'actualització a la versió següent durant l'enèsima setmana després d'haver detectat l'actualització. Per exemple, si es detecta una actualització avui, el primer valor de la llista defineix el percentatge de dispositius de l'UO que s'han d'actualitzar a aquesta versió abans no passi una setmana a partir d'avui. El segon valor defineix el percentatge de dispositius de l'UO que s'han d'actualitzar a aquesta versió abans no passin dues setmanes a partir d'avui, etc.
-
-      Si es defineix un valor per a aquesta política, les actualitzacions ignoraran la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> i seguiran aquesta.
-
-      Si aquesta llista està buida, les actualitzacions no es faran per fases, sinó que s'aplicaran tenint en compte altres polítiques de dispositius.
-
-      Aquesta política no s'aplica als canvis de canal.</translation>
 <translation id="7295019613773647480">Activa els usuaris supervisats</translation>
 <translation id="7301543427086558500">Especifica una llista d'URL alternatius que es poden fer servir per extreure termes de cerca del motor de cerca. Els URL han de contenir la cadena <ph name="SEARCH_TERM_MARKER" />, que s'utilitzarà per extreure els termes de cerca.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index c3895ed..e8dc29c 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -2223,15 +2223,6 @@
 
           Pokud je toto nastavení deaktivováno, tato funkce nebude dostupná.</translation>
 <translation id="7275334191706090484">Spravované záložky</translation>
-<translation id="729492886167634859">Tato zásada určuje seznam procentuálních podílů zařízení se systémem <ph name="PRODUCT_OS_NAME" /> v organizační jednotce, která se aktualizují každý týden ode dne prvního objevení aktualizace. Čas objevení je pozdější než čas publikování aktualizace, protože zařízení může dostupnost aktualizací zkontrolovat až nějakou dobu po publikování aktualizace.
-
-      N-tá hodnota v seznamu se použije jako procento zařízení, na kterých má být aktualizace na další verzi provedena v n-tém týdnu po objevení aktualizace. Pokud je například aktualizace objevena dnes, první hodnota v seznamu udává, jaké procento zařízení v organizační jednotce se má na danou verzi aktualizovat do jednoho týdne od dnes. Druhá hodnota udává, jaké procento zařízení v organizační jednotce se má na danou verzi aktualizovat do dvou týdnu od dnes, atd.
-
-      Pokud je v této zásadě definovaná nějaká hodnota, budou aktualizace ignorovat zásadu <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> a budou se namísto ní řídit touto zásadou.
-
-      Je-li seznam prázdný, aktualizace se nebudou zavádět na etapy, ale podle jiných zásad zařízení.
-
-      Tato zásada se nevztahuje na přepínání mezi kanály.</translation>
 <translation id="7295019613773647480">Aktivovat dozorovaného uživatele</translation>
 <translation id="7301543427086558500">Určuje seznam alternativních adres URL, ze kterých lze získat vyhledávací dotazy pro vyhledávač. Tyto adresy URL by měly obsahovat řetězec <ph name="SEARCH_TERM_MARKER" />, podle kterého budou vyhledávací dotazy rozpoznány.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index a38d2db..ab38b98c 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -2179,15 +2179,6 @@
 
           Hvis denne indstilling deaktiveres, vil denne funktion ikke være tilgængelig.</translation>
 <translation id="7275334191706090484">Administrerede bogmærker</translation>
-<translation id="729492886167634859">Denne politik angiver en liste over procentdele, som definerer den andel af <ph name="PRODUCT_OS_NAME" />-enheder i organisationsenheden, der skal opdateres pr. uge fra og med den dag, hvor opdateringen først opdages. Tidspunktet, hvor opdateringen opdages, ligger efter tidspunktet hvor opdateringen udgives, da der kan gå et stykke tid, efter opdateringen udgives, til enheden tjekker efter opdateringer.
-
-      Den n'te værdi på listen bruges som procentdelen af enheder, der skal færdiggøre opdateringen til den næste version i den n'te uge, efter opdateringen er opdaget. Hvis en opdatering f.eks. opdages i dag, definerer den første værdi på listen procentdelen af enheder i organisationsenheden, der skal opdatere til den pågældende version senest en uge fra i dag. Den anden værdi definerer procentdelen af enheder i organisationsenheden, der skal opdatere til den pågældende version senest to uger fra i dag osv.
-
-      Hvis der er angivet en værdi for denne politik, ignorerer opdateringer politikken <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> og følger denne politik i stedet.
-
-      Hvis denne liste er tom, anvendes ingen trindeling eller opdateringer i andre enhedspolitikker.
-
-      Denne politik gælder ikke for kanalskift.</translation>
 <translation id="7295019613773647480">Aktivér administrerede brugere</translation>
 <translation id="7301543427086558500">Angiver en liste over alternative webadresser, som kan bruges til at udlede søgetermer fra søgemaskinen. Webadresserne bør indeholde strengen <ph name="SEARCH_TERM_MARKER" />, som bruges til at udlede søgetermer.
 
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index a7048c2..01cb8b3b 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -2173,15 +2173,6 @@
 
           Bei Deaktivierung dieser Einstellung ist diese Funktion nicht verfügbar.</translation>
 <translation id="7275334191706090484">Verwaltete Lesezeichen</translation>
-<translation id="729492886167634859">Durch diese Richtlinie wird eine Liste mit Prozentwerten festgelegt, die angeben, welcher Anteil der <ph name="PRODUCT_OS_NAME" />-Geräte in der OE pro Woche aktualisiert werden, nachdem das Update entdeckt wurde. Der Abstand zwischen Entdeckungszeitpunkt und Veröffentlichungszeitpunkt hängt davon ab, wann das Gerät nach Updates sucht.
-
-      Der n-te Wert in der Liste gibt den Prozentsatz an Geräten an, die in der n-ten Woche, nachdem das Update entdeckt wurde, auf die nächste Version aktualisiert werden. Wenn zum Beispiel heute ein Update entdeckt wird, steht der erste Wert in der Liste für den Prozentsatz der Geräte in der OE, die bis heute in einer Woche auf diese Version aktualisiert werden sollen. Der zweite Wert gibt den Prozentsatz der Geräte in der OE an, die in der darauffolgenden zweiten Woche aktualisiert werden sollen, und so weiter.
-
-      Wenn für diese Richtlinie ein Wert festgelegt ist, folgen Updates dieser Richtlinie und ignorieren die Richtlinie <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />.
-
-      Falls diese Liste leer ist, erfolgt kein Staging und Updates werden gemäß anderen Geräterichtlinien angewendet.
-
-      Diese Richtlinie gilt nicht für Kanalwechsel.</translation>
 <translation id="7295019613773647480">Betreute Nutzer aktivieren</translation>
 <translation id="7301543427086558500">Definiert eine Liste alternativer URLs, mit denen Suchbegriffe aus der Suchmaschine extrahiert werden können. Die URLs sollten den String <ph name="SEARCH_TERM_MARKER" /> enthalten, der zum Extrahieren der Suchbegriffe verwendet wird.
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index ab17129..161326f 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -2268,15 +2268,6 @@
 
           Εάν απενεργοποιηθεί αυτή η πολιτική, αυτή η λειτουργία δεν θα είναι διαθέσιμη.</translation>
 <translation id="7275334191706090484">Διαχειριζόμενοι σελιδοδείκτες</translation>
-<translation id="729492886167634859">Αυτή η πολιτική προσδιορίζει μια λίστα ποσοστών που προσδιορίζουν το κλάσμα των συσκευών <ph name="PRODUCT_OS_NAME" /> στη ΜΟ (OU) για ενημέρωση ανά εβδομάδα, με έναρξη από την ημέρα που εντοπίζεται για πρώτη φορά η ενημέρωση. Ο χρόνος εντοπισμού είναι μεταγενέστερος από τον δημοσιευμένο χρόνο ενημέρωσης, καθώς θα μπορούσε να περάσει κάποιο χρονικό διάστημα από τη δημοσίευση της ενημέρωσης ώσπου η συσκευή να πραγματοποιήσει έλεγχο για ενημερώσεις.
-
-      Η νιοστή τιμή στη λίστα θα χρησιμοποιηθεί ως το ποσοστό των συσκευών που θα πρέπει να ολοκληρώσουν την ενημέρωση στην επόμενη έκδοση, στη νιοστή εβδομάδα μετά τον εντοπισμό της ενημέρωσης. Για παράδειγμα, εάν μια ενημέρωση εντοπιστεί σήμερα, τότε η πρώτη τιμή στη λίστα προσδιορίζει το ποσοστό των συσκευών στη ΜΟ (OU) που θα πρέπει να πραγματοποιήσουν ενημέρωση στη συγκεκριμένη έκδοση μέχρι μία εβδομάδα από σήμερα. Η δεύτερη τιμή προσδιορίζει το ποσοστό των συσκευών στη ΜΟ (OU) που θα πρέπει να πραγματοποιήσουν ενημέρωση στη συγκεκριμένη έκδοση μέχρι 2 εβδομάδες από σήμερα και ούτω καθεξής.
-
-      Εάν υπάρχει τιμή που έχει καθοριστεί για αυτήν την πολιτική, οι ενημερώσεις θα παραβλέψουν την πολιτική <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> και θα ακολουθήσουν τη συγκεκριμένη πολιτική.
-
-      Εάν αυτή η λίστα είναι κενή, δεν θα υπάρχει προετοιμασία και θα εφαρμοστούν ενημερώσεις σύμφωνα με άλλες πολιτικές χρήσης συσκευής.
-
-      Αυτή η πολιτική δεν ισχύει για εναλλαγές καναλιών.</translation>
 <translation id="7295019613773647480">Ενεργοποίηση εποπτευόμενων χρηστών</translation>
 <translation id="7301543427086558500">Καθορίζει μια λίστα εναλλακτικών διευθύνσεων URL που μπορούν να χρησιμοποιηθούν για την εξαγωγή όρων αναζήτησης από τη μηχανή αναζήτησης. Οι διευθύνσεις URL πρέπει να περιλαμβάνουν τη συμβολοσειρά <ph name="SEARCH_TERM_MARKER" />, η οποία θα χρησιμοποιηθεί για να εξαχθούν οι όροι αναζήτησης
 
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 3306d68..874d773 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -302,6 +302,11 @@
       If a setting is left unspecified, a default value is used.
 
       If this policy is unset, defaults are used for all settings.</translation>
+<translation id="1958138414749279167">Enables <ph name="PRODUCT_NAME" />'s AutoFill feature and allows users to auto-complete address information in web forms using previously stored information.
+
+      If this setting is disabled, AutoFill will never suggest, or fill address information, nor will it save additional address information that the user might submit while browsing the web.
+
+      If this setting is enabled or has no value, the user will be able to control AutoFill for addresses in the UI.</translation>
 <translation id="1960840544413786116">Whether to allow certificates issued by local trust anchors that are missing the subjectAlternativeName extension</translation>
 <translation id="1964634611280150550">Incognito mode disabled.</translation>
 <translation id="1964802606569741174">This policy has no effect on the Android YouTube app. If Safety Mode on YouTube should be enforced, installation of the Android YouTube app should be disallowed.</translation>
@@ -1925,6 +1930,7 @@
 <translation id="6440051664870270040">Allow sites to simultaneously navigate and open pop-ups</translation>
 <translation id="6447948611083700881">Backup and restore disabled</translation>
 <translation id="645425387487868471">Enable force sign-in for <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Enable AutoFill for addresses</translation>
 <translation id="6473623140202114570">Configure the list of domains on which Safe Browsing will not trigger warnings.</translation>
 <translation id="6491139795995924304">Allow bluetooth on device</translation>
 <translation id="6520802717075138474">Import search engines from default browser on first run</translation>
@@ -2280,15 +2286,6 @@
 
           If this setting is disabled, then this feature will not be available.</translation>
 <translation id="7275334191706090484">Managed Bookmarks</translation>
-<translation id="729492886167634859">This policy defines a list of percentages that will define the fraction of <ph name="PRODUCT_OS_NAME" /> devices in the OU to update per week starting from the day on which the update is first discovered. The discovery time is later than the update published time, since it could be a while after the update is published until the device checks for updates.
-
-      The n-th value in the list will be used as the percentage of devices that should complete updating to the next version in the n-th week after the update has been discovered. For example, if an update is discovered today, then the first value in the list defines the percentage of devices in the OU that should update to that version by a week from today. The second value defines the percentage of devices in the OU that should update to that version by 2 weeks from today, and so on.
-
-      If there is a value defined for this policy, updates will ignore the <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> policy and follow this policy instead.
-
-      If this list is empty, there will be no staging and updates will be applied according to other device policies.
-
-      This policy does not apply for channel switches.</translation>
 <translation id="7295019613773647480">Enable supervised users</translation>
 <translation id="7301543427086558500">Specifies a list of alternative URLs that can be used to extract search terms from the search engine. The URLs should contain the string <ph name="SEARCH_TERM_MARKER" />, which will be used to extract the search terms.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 559bae8c..082f660 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -2172,15 +2172,6 @@
 
           Si no se habilita esta opción, esta función no estará disponible.</translation>
 <translation id="7275334191706090484">Favoritos administrados</translation>
-<translation id="729492886167634859">Esta política define una lista de porcentajes que determinará la fracción de dispositivos <ph name="PRODUCT_OS_NAME" /> en la UO que se actualizará por semana a partir del día en que se descubre la actualización (este momento es posterior a la publicación, conforme a lo que tarde el dispositivo en buscar actualizaciones).
-
-      En la lista, el valor "n-th" representará el porcentaje de dispositivos que debe completar la actualización a la siguiente versión en la "n-th" semana a partir de su descubrimiento. Por ejemplo, si se descubre una actualización hoy, el primer valor en la lista define el porcentaje de dispositivos en la UO que debe actualizarse a esa versión en una semana a partir de hoy. El segundo valor define el porcentaje de dispositivos en la UO que debe actualizarse a esa versión en 2 semanas a partir de hoy, y así sucesivamente.
-
-      Si hay un valor definido para esta política, las actualizaciones ignorarán la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> y, en su lugar, seguirán esta.
-
-      Si esta lista está vacía, no se definirán etapas y se aplicarán las actualizaciones conforme a otras políticas de dispositivo.
-
-      No se aplica esta política para los cambios de canales.</translation>
 <translation id="7295019613773647480">Habilitar usuarios supervisados</translation>
 <translation id="7301543427086558500">Especifica una lista de URL alternativas que se pueden utilizar para extraer los términos de búsqueda del motor de búsqueda. Las URL deben contener la cadena <ph name="SEARCH_TERM_MARKER" />, que se usará para extraer los términos de búsqueda.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index f26f1503..59d3aaf 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -297,6 +297,11 @@
       Si no se configura una opción, se utilizará el valor predeterminado.
 
       Si no se define esta política, se utilizarán todos los valores predeterminados.</translation>
+<translation id="1958138414749279167">Habilita la función Autocompletar de <ph name="PRODUCT_NAME" /> y permite que los usuarios rellenen automáticamente formularios web con información almacenada anteriormente, como la información de la dirección.
+
+      Si inhabilitas esta opción, la función Autocompletar no hará sugerencias ni rellenará la información de la dirección, y tampoco guardará información adicional de la dirección que el usuario envíe cuando esté navegando por la Web.
+
+      Si habilitas esta opción o no estableces ningún valor, el usuario podrá controlar la función Autocompletar para información de la dirección en la IU.</translation>
 <translation id="1960840544413786116">Si se permiten los certificados emitidos por los anclajes de confianza locales que no tienen la extensión subjectAlternativeName</translation>
 <translation id="1964634611280150550">Modo de incógnito inhabilitado</translation>
 <translation id="1964802606569741174">Esta política no influye en la aplicación YouTube para Android. Si se debe aplicar el modo seguro en YouTube, deberás inhabilitar la descarga de la aplicación YouTube para Android.</translation>
@@ -1927,6 +1932,7 @@
 <translation id="6440051664870270040">Permitir que los sitios web abran ventanas emergentes y naveguen de forma simultánea</translation>
 <translation id="6447948611083700881">La función de copia de seguridad y restauración está inhabilitada</translation>
 <translation id="645425387487868471">Habilitar el inicio de sesión forzoso de <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Habilitar la función Autocompletar para direcciones</translation>
 <translation id="6473623140202114570">Configura la lista de dominios en los que la Navegación Segura no activará advertencias.</translation>
 <translation id="6491139795995924304">Permitir Bluetooth en el dispositivo</translation>
 <translation id="6520802717075138474">Importa los motores de búsqueda desde el navegador predeterminado en la primera ejecución.</translation>
@@ -2282,15 +2288,6 @@
 
           Si no se habilita esta opción, esta función no estará disponible.</translation>
 <translation id="7275334191706090484">Marcadores administrados</translation>
-<translation id="729492886167634859">Esta política define una lista de porcentajes que determinan qué parte de dispositivos <ph name="PRODUCT_OS_NAME" /> de la UO se actualizarán semanalmente a partir del día en el que se descubra la actualización. El momento de descubrimiento es posterior al momento de la publicación de la actualización, ya que puede haber pasado un tiempo desde que se publica la actualización hasta que el dispositivo busca actualizaciones.
-
-      El enésimo valor de la lista indicará el porcentaje de dispositivos que debe completar la actualización a la siguiente versión en la enésima semana posterior al descubrimiento de la actualización. Por ejemplo, si se descubre una actualización hoy, el primer valor de la lista definirá el porcentaje de los dispositivos de la UO que se deben actualizar a esa versión en 2 semanas a partir de hoy.
-
-      Si se ha asignado un valor a esta política, las actualizaciones ignorarán la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> y seguirán esta.
-
-      Si esta lista está vacía, no se hará un lanzamiento progresivo y las actualizaciones se aplicarán de acuerdo con otras políticas de dispositivos.
-
-      Esta política no se aplica a los cambios de canal.</translation>
 <translation id="7295019613773647480">Habilitar usuarios supervisados</translation>
 <translation id="7301543427086558500">Permite especificar una lista de URL alternativas que se pueden utilizar para extraer términos de búsqueda del motor de búsqueda. Las URL deben incluir la cadena <ph name="SEARCH_TERM_MARKER" />, que se utilizará para extraer los términos de búsqueda.
 
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 24b17b74..2190da9 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -2271,15 +2271,6 @@
 
           Kui see seade on keelatud, siis pole funktsioon saadaval.</translation>
 <translation id="7275334191706090484">Hallatud järjehoidjad</translation>
-<translation id="729492886167634859">See reegel määrab loendi protsentidest, mis sätestavad OU operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmete murdosa, mida alates värskenduse leidmisest kord nädalas värskendatakse. Avastamisaeg on hilisem kui värskenduse avaldamise aeg, kuna pärast värskenduse avaldamist võib seadmel kuluda värskenduste otsimiseks pisut aega.
-
-      Loendi n-väärtust kasutatakse seadmete protsendina, mis tuleb värskendada järgmisele versioonile n. nädalal pärast värskenduse leidmist. Näiteks kui värskendus avastatakse täna, määrab loendi esimene väärtus OU seadmete protsendi, mis peaksid alates tänasest nädala jooksul sellele versioonile üle minema. Teine väärtus määrab OU seadmete protsendi, mis peaksid alates tänasest kahe nädala jooksul sellele versioonile üle minema, jne.
-
-      Kui reegli väärtus on määratud, eiravad värskendused reeglit <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ja järgivad selle asemel seda reeglit.
-
-      Kui loend on tühi, siis kontrollimist ei kasutata ja värskendused rakendatakse seadme muude eeskirjade alusel.
-
-      Reegel ei kehti kanalivahetuste puhul.</translation>
 <translation id="7295019613773647480">Luba valvatavad kasutajad</translation>
 <translation id="7301543427086558500">Määrab asendus-URL-ide loendi, mida saab kasutada otsinguterminite ekstraktimiseks otsingumootorist. URL-id peavad sisaldama stringi <ph name="SEARCH_TERM_MARKER" />, mida kasutatakse otsinguterminite ekstraktimiseks.
 
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index bdaea2d..3ac3c1b 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -1120,6 +1120,15 @@
 
           اگر این خط‌مشی تنظیم نشود، برای همه سایت‌ها از مقدار پیش‌فرض کلی استفاده می‌شود، این مقدار یا از خط‌مشی «DefaultKeygenSetting» (درصورت تنظیم)، یا به‌صورتی دیگر از پیکربندی شخصی کاربر گرفته می‌شود.</translation>
 <translation id="4239720644496144453">‏حافظه پنهان برای برنامه‌های Android استفاده نمی‌شود. اگر چند کاربر برنامه Android مشابه‌ای را نصب کنند، برای هر کاربر یک برنامه جدید بارگیری خواهد شد.</translation>
+<translation id="4243336580717651045">‏جمع‌آوری داده ناشناس‌شده حاوی نشانی وب را در <ph name="PRODUCT_NAME" /> فعال می‌کند و اجازه نمی‌دهد کاربران این تنظیم را تغییر دهند.
+
+      جمع‌آوری داده ناشناس‌شده حاوی نشانی وب، برای بهتر کردن مرور و جستجو، نشانی وب صفحه‌هایی را که کاربران بازدید می‌کنند به Google ارسال می‌کند.
+
+      اگر این خط‌مشی فعال شود، جمع‌آوری داده ناشناس‌شده حاوی نشانی وب همیشه فعال است.
+
+      اگر این خط‌مشی غیرفعال شود، جمع‌آوری داده ناشناس‌شده حاوی نشانی وب هرگز فعال نمی‌شود.
+
+      اگر این خط‌مشی تنظیم نشود، جمع‌آوری داده ناشناس‌شده حاوی نشانی وب فعال می‌شود اما کاربر می‌تواند آن را تغییر دهد.</translation>
 <translation id="4250680216510889253">نه</translation>
 <translation id="4261820385751181068">منطقه زبانی صفحه ورود به سیستم دستگاه</translation>
 <translation id="427220754384423013">‏چاپگرهایی را که کاربر می‌تواند استفاده کند مشخص می‌کند.
@@ -1743,6 +1752,7 @@
           روش توصیه شده برای قفل کردن صفحه بی‌حرکت، فعال کردن تعلیق برای قفل صفحه و معلق کردن <ph name="PRODUCT_OS_NAME" /> پس از مدت زمان درنگ عدم فعالیت است. این خط‌مشی باید تنها هنگامی استفاده شود که قفل صفحه باید مقدار مشخصی زودتر از تعلیق رخ دهد یا هنگامی که تعلیق در حالت بدون فعالیت بودن اصلاً مطلوب نباشد.
 
           مقدار خط‌مشی باید به میلی‌ثانیه تعیین شود. مقادیر کنترل شده‌اند که کمتر از زمان درنگ عدم فعالیت باشند.</translation>
+<translation id="6097601282776163274">فعال کردن جمع‌آوری داده ناشناس‌شده حاوی نشانی وب</translation>
 <translation id="6111936128861357925">‏اجازه به بازی Dinosaur Easter Egg</translation>
 <translation id="6114416803310251055">منسوخ</translation>
 <translation id="6133088669883929098">اجازه دادن به همه سایت‌ها برای استفاده از تولید کلید</translation>
@@ -2158,15 +2168,6 @@
 
  اگر این تنظیمات غیرفعال شود، این قابلیت در دسترس نخواهد بود.</translation>
 <translation id="7275334191706090484">نشانک‌های مدیریت شده</translation>
-<translation id="729492886167634859">‏این خط‌مشی فهرستی از درصدهایی را تعریف می‌کند که مشخص می‌کنند چه بخشی از دستگاه‌های <ph name="PRODUCT_OS_NAME" /> در واحد سازمانی، هر هفته به‌روزرسانی شوند (شروع این عملیات از روزی است که به‌روزرسانی شناسایی می‌شود). زمان شناسایی دیرتر از انتشار به‌روزرسانی است، زیرا ممکن است بین زمان انتشار به‌روزرسانی و زمانی که دستگاه وجود به‌روزرسانی را بررسی می‌کند فاصله وجود داشته باشد.
-
-      مقدار nاُم در این فهرست، درصد دستگاه‌هایی را نشان می‌دهد که باید تا n هفته بعد از شناسایی به‌روزرسانی، به نسخه بعدی به‌روزرسانی شوند. برای مثال، اگر به‌روزرسانی امروز شناسایی شود، اولین مقدار در فهرست، درصد دستگاه‌هایی را مشخص می‌کند که باید تا یک هفته از امروز در واحد سازمانی به‌روزرسانی شوند. مقدار دوم دستگاه‌هایی را مشخص می‌کند که باید تا ۲ هفته از امروز در واحد سازمانی به‌روزرسانی شوند و به همین ترتیب تا آخر.
-
-      اگر مقداری برای این خط‌مشی تعیین شود، به‌روزرسانی‌ها خط‌مشی <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> را نادیده می‌گیرند و به‌جای آن از این خط‌مشی پیروی می‌کنند.
-
-      اگر این فهرست خالی باشد، هیچ‌گونه مرحله‌بندی وجود نخواهد داشت و به‌روزرسانی‌ها طبق سایر خط‌مشی‌های دستگاه‌ اعمال می‌شود.
-
-      این خط‌مشی برای جابه‌جایی میان کانال‌ها کاربرد ندارد.</translation>
 <translation id="7295019613773647480">به کار انداختن کاربرهای نظارت‌شده</translation>
 <translation id="7301543427086558500">‏فهرستی از نشانی‌های وب جایگزین که می‌توانند برای استخراج عبارات جستجو از موتور جستجو مورد استفاده قرار گیرند را مشخص می‌کند. نشانی‌های وب باید شامل رشته <ph name="SEARCH_TERM_MARKER" /> باشد که برای استخراج واژه‌های جستجو استفاده خواهد شد.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index f469c6b..bf378db 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -294,6 +294,11 @@
       Jos jotain asetusta ei ole määritetty, käytetään oletusarvoa.
 
       Jos tätä käytäntöä ei ole määritetty, kaikille asetuksille käytetään oletusarvoja.</translation>
+<translation id="1958138414749279167">Kun tämä on käytössä, <ph name="PRODUCT_NAME" /> voi täyttää kenttiä automaattisesti. Käyttäjät voivat täyttää verkkolomakkeita aiemmin tallennetuilla osoitetiedoilla.
+
+      Jos asetus poistetaan käytöstä, automaattinen täyttö ei ehdota osoitetietoja, täytä niitä tai tallenna uusia osoitetietoja myöhempää käyttöä varten selailun yhteydessä.
+
+      Jos tämä asetus on käytössä tai sille ei ole määritetty arvoa, käyttäjä voi hallita osoitteiden automaattista täyttöä käyttöliittymässä.</translation>
 <translation id="1960840544413786116">Hyväksytäänkö paikallisen luottamusankkurin myöntämä varmenne, jos siitä puuttuu subjectAlternativeName-laajennus</translation>
 <translation id="1964634611280150550">Incognito-tila poistettu käytöstä</translation>
 <translation id="1964802606569741174">Tällä käytännöllä ei ole mitään vaikutusta Androidin YouTube-sovellukseen. Jos YouTuben suojattu tila on käytössä, Androidin YouTube-sovelluksen asentamisen ei pitäisi olla sallittua.</translation>
@@ -1837,6 +1842,7 @@
 <translation id="6440051664870270040">Salli sivustojen käyttää siirtymistoimintoja ja avata ponnahdusikkunoita samanaikaisesti</translation>
 <translation id="6447948611083700881">Varmuuskopiointi ja palautus poistettu käytöstä</translation>
 <translation id="645425387487868471">Ota käyttöön pakotettu kirjautuminen tuotteessa <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Salli osoitteiden automaattinen täyttö</translation>
 <translation id="6473623140202114570">Määritä luettelo niistä verkkotunnuksista, joissa selaussuoja ei käynnistä varoituksia.</translation>
 <translation id="6491139795995924304">Salli Bluetoothin käyttäminen laitteella</translation>
 <translation id="6520802717075138474">Tuo hakukoneet oletusselaimesta ensimmäisellä käyttökerralla</translation>
@@ -2177,15 +2183,6 @@
 
           Jos tämä asetus ei ole käytössä, tämä ominaisuus ei ole käytettävissä.</translation>
 <translation id="7275334191706090484">Hallinnoidut kirjanmerkit</translation>
-<translation id="729492886167634859">Tämä käytäntö määrittelee prosenttiosuuksien listalla, mikä osuus organisaatioyksikön <ph name="PRODUCT_OS_NAME" /> ‑laitteista päivitetään viikoittain päivityksen ensimmäisestä havaitsemispäivästä alkaen. Havaitsemishetki on päivityksen julkaisuhetken jälkeen, sillä laite saattaa tarkistaa päivitykset vasta jonkin aikaa julkaisuhetken jälkeen.
-
-      Listan n:s arvo on niiden laitteiden osuus, joiden pitäisi olla päivitettynä seuraavaan versioon, kun päivityksen havaitsemisesta on kulunut n viikkoa. Jos päivitys siis havaitaan tänään, listan ensimmäinen arvo määrittää, mikä osuus organisaatioyksikön laitteista pitäisi päivittää viikon sisällä tästä päivästä. Toinen arvo taas määrittää kahden viikon sisällä tästä hetkestä päivitettävien laitteiden osuuden, ja niin edelleen.
-
-      Jos tälle käytännölle on määritetty arvo, päivitykset eivät noudata <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />-käytäntöä vaan tätä käytäntöä.
-
-      Jos tämä lista on tyhjä, päivityksiä ei asenneta vaiheittain vaan muiden laitekäytäntöjen mukaan.
-
-      Tätä käytäntöä ei sovelleta kanavan vaihtoihin.</translation>
 <translation id="7295019613773647480">Ota käyttöön valvotut käyttäjät</translation>
 <translation id="7301543427086558500">Määrittää luettelon vaihtoehtoisia URL-osoitteita, joiden avulla voidaan noutaa hakutermejä hakukoneelta. URL-osoitteiden tulee sisältää merkkijono <ph name="SEARCH_TERM_MARKER" />, jota käytetään hakutermien noutamiseen.
 
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index d3a6a57..6f3c2ab 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -2269,15 +2269,6 @@
 
           Kung naka-disable ang setting na ito, hindi magiging available ang tampok na ito.</translation>
 <translation id="7275334191706090484">Mga Pinamamahalaang Bookmark</translation>
-<translation id="729492886167634859">Naglalarawan ang patakarang ito ng listahan ng mga porsyentong maglalarawan sa bahagi ng mga <ph name="PRODUCT_OS_NAME" /> device sa OU na mag-a-update kada linggo simula sa araw ng pagkakatuklas sa update. Mahuhuli ang oras ng pagkakatuklas sa oras ng pag-publish sa update, dahil maaaring matagalan ang pagsusuri ng device para sa mga update pagkatapos ng pag-publish sa update.
-
-      Gagamitin ang n-th na value sa listahan bilang porsyento ng mga device na dapat matapos mag-update sa susunod na bersyon sa n-th na linggo pagkatapos matuklasan ang update. Halimbawa, kung may matutuklasang update ngayon, ilalarawan ng unang value sa listahan ang porsyento ng mga device sa OU na dapat mag-update sa bersyong iyon isang linggo mula ngayon. Ilalarawan ng pangalawang value ang porsyento ng mga device sa OU na dapat mag-update sa bersyong iyon 2 linggo mula ngayon, at iba pa.
-
-      Kung may inilalarawang value para sa patakarang ito, babalewalain ng mga update ang patakarang <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> at sa halip ay susundin nito ang patakarang ito.
-
-      Kung walang laman ang patakarang ito, walang magiging pag-stage at mailalapat ang mga update ayon sa iba pang patakaran sa device.
-
-      Hindi nalalapat ang patakarang ito sa mga paglipat ng channel.</translation>
 <translation id="7295019613773647480">I-enable ang mga pinangangasiwaang user</translation>
 <translation id="7301543427086558500">Tinutukoy ang isang listahan ng mga kahaliling URL na magagamit upang kumuha ng mga termino para sa paghahanap sa search engine. Nilalaman dapat ng mga URL ang string na <ph name="SEARCH_TERM_MARKER" />, na gagamitin upang kunin ang mga termino para sa paghahanap.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 975c88bd..3f856ab 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -2284,15 +2284,6 @@
 
           S'il est désactivé, cette fonctionnalité est alors indisponible.</translation>
 <translation id="7275334191706090484">Favoris gérés</translation>
-<translation id="729492886167634859">Cette règle dresse une liste de pourcentages qui définit la fraction d'appareils <ph name="PRODUCT_OS_NAME" /> de l'unité organisationnelle qui doivent être mis à jour par semaine à compter de la date où la mise à jour est détectée pour la première fois. La date de détection est postérieure à la date de publication de la mise à jour, car un certain temps peut s'écouler avant que l'appareil ne recherche des mises à jour après la publication de la mise à jour.
-
-      La valeur énième indiquée dans la liste définit le pourcentage d'appareils pour lesquels la nouvelle version doit être installée d'ici la énième semaine une fois qu'elle est détectée. Par exemple, si une mise à jour est détectée aujourd'hui, la première valeur de la liste définit le pourcentage d'appareils de l'unité organisationnelle pour lesquels cette version doit être installée d'ici une semaine à compter d'aujourd'hui. La deuxième valeur définit le pourcentage d'appareils de l'UO pour lesquels cette version doit être installée d'ici deux semaines à compter d'aujourd'hui, et ainsi de suite.
-
-      Si cette règle est définie sur une valeur, elle s'applique à la place de la règle <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />.
-
-      Si cette liste est vide, il n'y a pas de déploiement par étapes et les mises à jour sont appliquées en fonction des autres règles des appareils.
-
-      Cette règle ne concerne pas les changements de version.</translation>
 <translation id="7295019613773647480">Activer les utilisateurs supervisés</translation>
 <translation id="7301543427086558500">Spécifie une liste d'URL alternatives pouvant être utilisées pour extraire des termes de recherche du moteur de recherche. Les URL doivent contenir la chaîne "<ph name="SEARCH_TERM_MARKER" />", qui est utilisée pour extraire les termes de recherche.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index 6438200..c64eda2 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -2550,13 +2550,6 @@
       જો તમે આ સેટિંગ અક્ષમ કરો છો, તો વપરાશકર્તાઓને Smart Lock નો ઉપયોગ કરવાની મંજૂરી આપવામાં આવશે નહીં.
 
      જો આ નીતિને સેટ કર્યા વગર છોડવામાં આવે, તો ડિફૉલ્ટને એન્ટરપ્રાઇઝ-સંચાલિત વપરાશકર્તાઓ માટે મંજૂરી આપવામાં આવતી નથી અને બિન-સંચાલિત વપરાશકર્તાઓ માટે મંજૂરી આપવામાં આવે છે.</translation>
-<translation id="729492886167634859">આ નીતિ ટકાવારીની સૂચિ જણાવે છે જે, અપડેટ પ્રથમ વાર શોધાયું હોય તે દિવસથી શરૂ કરીને અઠવાડિયા પ્રમાણએ અપડેટ કરવા માટે, OUમાં <ph name="PRODUCT_OS_NAME" /> ઉપકરણોનો ભાગ જણાવશે. અપડેટ શોધાયાનો સમય અપડેટ પ્રકાશિત થયાના સમય પછીનો હશે, કારણ કે અપડેટ પ્રકાશિત થયા પછી ઉપકરણ અપડેટ માટે તપાસ કરે તેમાં થોડો સમય લાગી શકે છે.
-      સૂચિમાંના n-મા મૂલ્યનો ઉપયોગ ઉપકરણોની ટકાવારી તરીકે કરવામાં આવશે, કે જે અપડેટ શોધાયા પછી n-મા અઠવાડિયામાં આગલા વર્ઝન પર પૂરેપૂરા અપડેટ થવા જોઈએ. ઉદાહરણ તરીકે, જો અપડેટ આજે શોધાયું હોય, તો સૂચિમાંનું પહેલું મૂલ્ય OUમાંના ઉપકરણોની એ ટકાવારી આપે છે જે આજથી એક અઠવાડિયામાં એ વર્ઝન પર અપડેટ થવા જોઈએ. બીજું મૂલ્ય OUમાંના ઉપકરણોની એ ટકાવારી આપે છે જે આજથી 2 અઠવાડિયાંમાં એ વર્ઝન પર અપડેટ થવા જોઈએ અને એ મુજબ વધુ.
-      જો આ નીતિ માટે કોઈ મૂલ્ય વ્યાખ્યાયિત કરેલું હશે, તો અપડેટ <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> નીતિને અવગણશે અને તેને બદલે આ નીતિને અનુસરશે.
-
-      જો આ સૂચિ ખાલી હશે, તો કોઈ સ્ટેજિંગ નહીં થાય અને અન્ય ઉપકરણોની નીતિઓ અનુસાર અપડેટ લાગુ કરવામાં આવશે.
-
-      આ નીતિ ચૅનલ સ્વિચો માટે લાગુ થતી નથી.</translation>
 <translation id="7295019613773647480">નિરીક્ષણ કરેલ વપરાશકર્તાઓને સક્ષમ કરો.</translation>
 <translation id="7301543427086558500">વૈકલ્પિક URL ની એક સૂચિ ઉલ્લેખિત કરે છે કે જેનો ઉપયોગ શોધ એન્જિનમાંથી શોધ શબ્દો કાઢવા માટે કરી શકાય છે. URL માં સ્ટ્રિંગ <ph name="SEARCH_TERM_MARKER" /> હોવી જોઈએ, જેનો ઉપયોગ શોધ શબ્દો કાઢવા માટે થશે.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index 14ccc28..85ab428 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -2288,15 +2288,6 @@
 
           यदि यह सेटिंग अक्षम की गई हो, तो यह सुविधा उपलब्ध नहीं होगी.</translation>
 <translation id="7275334191706090484">प्रबंधित बुकमार्क</translation>
-<translation id="729492886167634859">यह नीति OU में मौजूद <ph name="PRODUCT_OS_NAME" /> डिवाइस के ऐसे हिस्से तय करने वाले प्रतिशत की सूची बताती है जिन्हें अपडेट का पहली बार पता चलने वाले दिन से शुरू करते हुए हर हफ़्ते अपडेट किया जाना है. पता चलने का समय अपडेट प्रकाशित किए जाने से बाद का समय होता है, क्योंकि अपडेट प्रकाशित करने के बाद डिवाइस पर अपडेट देखने में कुछ समय लग सकता है.
-
-      सूची में दिए गए n-वें मान का इस्तेमाल उन डिवाइस के प्रतिशत के रूप में किया जाएगा जिन्हें अपडेट का पता चलने के बाद n-वें हफ़्ते में अगले वर्शन में अपडेट करने का काम पूरा कर लेना चाहिए. उदाहरण के लिए, अगर आज किसी अपडेट का पता लगता है, तो सूची में दिया गया पहला मान OU में मौजूद उन डिवाइस का प्रतिशत तय करता है जिन्हें आज से एक हफ़्ते के अंदर उस वर्शन में अपडेट हो जाना चाहिए. दूसरा मान OU में मौजूद उन डिवाइस का प्रतिशत तय करता है जिन्हें आज से दो हफ़्ते के अंदर उस वर्शन में अपडेट हो जाना चाहिए और आगे इसी तरह बताया जाता है.
-
-      अगर इस नीति के लिए कोई मान तय किया जाता है, तो अपडेट <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> नीति को अनदेखा करेंगे और उसके बजाय इस नीति का पालन करेंगे.
-
-      अगर यह सूची खाली होती है, तो अपडेट लागू करने के लिए कोई कदम दर कदम शेड्यूल नहीं होगा और अपडेट दूसरी डिवाइस नीतियों के हिसाब से लागू किए जाएंगे.
-
-      यह नीति चैनल स्विच करने के मामले में लागू नहीं होती है.</translation>
 <translation id="7295019613773647480">पर्यवेक्षित उपयोगकर्ताओं को सक्षम करें</translation>
 <translation id="7301543427086558500">वैकल्पिक यूआरएल की उस सूची को निर्दिष्ट करती है जिसका उपयोग सर्च इंजन से सर्च के लिए इस्तेमाल किये गए शब्दों को निकालने के लिए किया जा सकता है. यूआरएल में स्ट्रिंग <ph name="SEARCH_TERM_MARKER" /> होनी चाहिए, जिसका उपयोग सर्च के लिए इस्तेमाल किये गए शब्दों को निकालने के लिए किया जाएगा.
 
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index 29b1029a..56f7074 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -296,6 +296,11 @@
       Ako se postavka ne odredi, upotrijebit će se zadana vrijednost.
 
       Ako se pravilo ne postavi, za sve će se postavke upotrijebiti zadane vrijednosti.</translation>
+<translation id="1958138414749279167">Omogućuje značajku Automatsko popunjavanje na usluzi <ph name="PRODUCT_NAME" /> i omogućuje korisnicima automatsko unošenje podataka o adresi u web-obrasce pomoću prethodno pohranjenih podataka.
+
+      Ako se ta postavka onemogući, Automatsko popunjavanje nikad neće predlagati niti unositi podatke o adresi niti će spremati dodatne podatke o adresi koje korisnik može unijeti tijekom pregledavanja weba.
+
+      Ako se ta postavka omogući ili nema vrijednost, korisnik će moći kontrolirati Automatsko popunjavanje za adrese na korisničkom sučelju.</translation>
 <translation id="1960840544413786116">Jesu li dopušteni certifikati koje izdaju lokalna pouzdana sidra, a kojima nedostaje proširenje subjectAlternativeName</translation>
 <translation id="1964634611280150550">Onemogućen je anoniman način rada</translation>
 <translation id="1964802606569741174">To pravilo nema utjecaja na Android aplikaciju YouTube. Ako se treba primijeniti sigurnosni način na YouTubeu, instaliranje Android aplikacije YouTube ne može biti dopušteno.</translation>
@@ -1845,6 +1850,7 @@
 <translation id="6440051664870270040">Dopusti web-lokacijama istovremenu navigaciju i otvaranje skočnih prozora</translation>
 <translation id="6447948611083700881">Sigurnosno kopiranje i vraćanje su onemogućeni</translation>
 <translation id="645425387487868471">Omogući nametanje prijave za preglednik <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Omogući Automatsko popunjavanje za adrese</translation>
 <translation id="6473623140202114570">Konfiguriranje popisa domena na kojima Sigurno pregledavanje neće prikazivati upozorenja.</translation>
 <translation id="6491139795995924304">Omogući Bluetooth na uređaju</translation>
 <translation id="6520802717075138474">Uvoz tražilica iz zadanog preglednika pri prvom pokretanju</translation>
@@ -2178,15 +2184,6 @@
 
           Ako je ta postavka onemogućena, ta značajka neće biti dostupna.</translation>
 <translation id="7275334191706090484">Upravljane oznake</translation>
-<translation id="729492886167634859">Pravilom se definira popis postotaka kojim će se definirati udio <ph name="PRODUCT_OS_NAME" /> uređaja u organizacijskoj jedinici za tjedno ažuriranje počevši od dana otkrivanja ažuriranja. Vrijeme otkrivanja kasnije je od vremena objavljivanja ažuriranja jer nakon objavljivanja ažuriranja može proći neko vrijeme dok uređaj ne potraži ažuriranja.
-
-      N-ta vrijednost na popisu upotrebljavat će se kao postotak uređaja koji bi trebali dovršiti ažuriranje na sljedeću verziju u n-tom tjednu nakon otkrivanja ažuriranja. Na primjer, ako se ažuriranje otkrije danas, prva vrijednost na popisu definira postotak uređaja u organizacijskoj jedinici koji bi se trebali ažurirati na tu verziju u roku od tjedan dana od danas. Druga vrijednost definira postotak uređaja u organizacijskoj jedinici koji bi se trebali ažurirati na tu verziju u roku od dva tjedna od danas i tako dalje.
-
-      Ako se za ovo pravilo definira vrijednost, ažuriranja će zanemariti pravilo <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> i slijediti ovo pravilo.
-
-      Ako je popis prazan, neće biti postupnog uvođenja i ažuriranja će se primijeniti u skladu s drugim pravilima za uređaje.
-
-      Pravilo se ne primjenjuje na prebacivanje kanala.</translation>
 <translation id="7295019613773647480">Omogući nadzirane korisnike</translation>
 <translation id="7301543427086558500">Navodi popis zamjenskih URL-ova koji se mogu upotrijebiti za izvlačenje pojmova pretraživanja iz tražilice. URL-ovi trebaju sadržavati niz <ph name="SEARCH_TERM_MARKER" />, koji će se upotrijebiti za izvlačenje pojmova pretraživanja.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index e598d600..e7aae3a 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -2177,15 +2177,6 @@
 
           Ha a beállítás le van tiltva, akkor ez a funkció nem lesz elérhető.</translation>
 <translation id="7275334191706090484">Kezelt könyvjelzők</translation>
-<translation id="729492886167634859">Ez a házirend megadja azon százalékok listáját, amelyek meghatározzák, hogy a szervezeti egység (SZE) <ph name="PRODUCT_OS_NAME" />-eszközeinek mekkora része frissül hetente, a frissítés első észlelésétől kezdődően. Az észlelés ideje a frissítés közzététele után van, mivel a közzététel után eltarthat bizonyos ideig, mire az eszköz frissítéseket keres.
-
-      A lista n. értéke azon eszközök százalékát jelöli, amelyek elvégzik a következő verzióra való frissítést a frissítés észlelését követő n. héten. Ha például ma észleli a rendszer a frissítést, akkor a lista első helyén álló érték határozza meg az SZE azon eszközeinek százalékát, amelyek frissítenek az új verzióra mától számítva egy héten belül. A második érték határozza meg az SZE azon eszközeinek százalékát, amelyek frissítenek az új verzióra mától számítva két héten belül és így tovább.
-
-      Ha meg van adva a házirend értéke, a frissítések figyelmen kívül hagyják a <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> házirendet, és ezt a házirendet követik.
-
-      Ha a lista üres, nem lesz fokozatos frissítés, hanem a többi eszközházirendnek megfelelően telepíti a rendszer a frissítéseket.
-
-      A házirend nem vonatkozik a csatornaváltásokra.</translation>
 <translation id="7295019613773647480">Felügyelt felhasználók engedélyezése</translation>
 <translation id="7301543427086558500">Olyan alternatív URL-ek listáját adja meg, amelyekkel a keresett kifejezések nyerhetők ki a keresőmotorból. Az URL-eknek tartalmazniuk kell a keresett kifejezések kinyerésére szolgáló <ph name="SEARCH_TERM_MARKER" /> karakterláncot.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 906b2ce0..ea8f16e 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -294,6 +294,11 @@
       Jika setelan tidak ditetapkan, nilai default akan digunakan.
 
       Jika kebijakan ini tidak disetel, setelan default digunakan untuk semua setelan.</translation>
+<translation id="1958138414749279167">Mengaktifkan fitur IsiOtomatis <ph name="PRODUCT_NAME" /> dan memungkinkan pengguna mengisi otomatis informasi alamat di formulir web menggunakan informasi yang disimpan sebelumnya.
+
+      Jika setelan ini dinonaktifkan, IsiOtomatis tidak akan menyarankan atau mengisi informasi alamat, serta tidak akan menyimpan informasi alamat tambahan yang mungkin dikirim oleh pengguna saat browsing web.
+
+      Jika setelan ini diaktifkan atau tidak memiliki nilai, pengguna dapat mengontrol fitur IsiOtomatis untuk alamat di UI.</translation>
 <translation id="1960840544413786116">Apakah sertifikat yang dikeluarkan oleh sumber tepercaya setempat yang tidak menyertakan ekstensi subjectAlternativeName diizinkan atau tidak</translation>
 <translation id="1964634611280150550">Mode penyamaran dinonaktifkan</translation>
 <translation id="1964802606569741174">Kebijakan ini tidak memengaruhi aplikasi YouTube Android. Jika Mode Perlindungan di YouTube harus diterapkan, pemasangan aplikasi YouTube Android harus dilarang.</translation>
@@ -1835,6 +1840,7 @@
 <translation id="6440051664870270040">Izinkan situs menavigasi dan membuka (jendela) pop-up sekaligus</translation>
 <translation id="6447948611083700881">Opsi backup dan pemulihan dinonaktifkan</translation>
 <translation id="645425387487868471">Aktifkan login paksa untuk <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Mengaktifkan IsiOtomatis untuk alamat</translation>
 <translation id="6473623140202114570">Mengonfigurasi daftar domain tempat Safe Browsing tidak akan memicu peringatan.</translation>
 <translation id="6491139795995924304">Izinkan bluetooth di perangkat</translation>
 <translation id="6520802717075138474">Impor mesin telusur dari browser default saat pertama kali dijalankan</translation>
@@ -2176,15 +2182,6 @@
 
           Jika setelan ini dinonaktifkan, fitur ini tidak akan tersedia.</translation>
 <translation id="7275334191706090484">Bookmark yang Terkelola</translation>
-<translation id="729492886167634859">Kebijakan ini menentukan daftar persentase yang akan menentukan jumlah perangkat <ph name="PRODUCT_OS_NAME" /> di OU untuk diupdate per minggu sejak hari pertama update ditemukan. Waktu penemuan lebih lama daripada waktu publikasi update, karena publikasi update mungkin agak lama hingga perangkat memeriksa apakah ada update.
-
-      Nilai ke-n pada daftar akan digunakan sebagai persentase perangkat yang harus menyelesaikan update ke versi berikutnya dalam minggu ke-n setelah update ditemukan. Misalnya, jika update ditemukan hari ini, nilai pertama pada daftar menentukan persentase perangkat di OU yang harus diupdate ke versi tersebut satu minggu dari hari ini. Nilai kedua menentukan persentase perangkat di OU yang harus diupdate ke versi tersebut dua minggu dari hari ini, dan sebagainya.
-
-      Jika ada nilai yang ditentukan untuk kebijakan ini, update akan mengabaikan kebijakan <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> dan mengikuti kebijakan ini.
-
-      Jika daftar ini kosong, tidak akan ada persiapan dan update akan diterapkan menurut kebijakan perangkat lain.
-
-      Kebijakan ini tidak berlaku untuk peralihan channel.</translation>
 <translation id="7295019613773647480">Aktifkan pengguna yang dilindungi</translation>
 <translation id="7301543427086558500">Menentukan daftar URL pengganti yang dapat digunakan untuk mengekstrak istilah penelusuran dari mesin telusur. URL harus berisi string <ph name="SEARCH_TERM_MARKER" />, yang akan digunakan untuk mengekstrak istilah penelusuran.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 43a50171..91423d9 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -2134,15 +2134,6 @@
 
 Se l'impostazione viene disattivata, questa funzione non sarà disponibile.</translation>
 <translation id="7275334191706090484">Preferiti gestiti</translation>
-<translation id="729492886167634859">Questa norma definisce un elenco di percentuali che definiranno la frazione dei dispositivi di <ph name="PRODUCT_OS_NAME" /> nella UO da aggiornare ogni settimana a partire dal giorno in cui l'aggiornamento viene rilevato. L'ora del rilevamento è successiva all'ora in cui l'aggiornamento viene pubblicato, perché potrebbe passare del tempo tra la pubblicazione dell'aggiornamento e il momento in cui il dispositivo controlla la disponibilità di aggiornamenti.
-
-      Il valore n nell'elenco verrà usato come percentuale di dispositivi che dovrebbero completare l'aggiornamento alla versione successiva entro una n settimana dal rilevamento dell'aggiornamento. Ad esempio, se oggi viene rilevato un aggiornamento, il primo valore nell'elenco definisce la percentuale di dispositivi nella UO che dovrebbero essere aggiornati a quella versione entro una settimana a partire da oggi. Il secondo valore definisce la percentuale di dispositivi nella UO che dovrebbero essere aggiornati a quella versione entro due settimane a partire da oggi e così via.
-
-      Se viene definito un valore per questa norma, gli aggiornamenti la applicano ignorando la norma <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />.
-
-      Se quest'elenco è vuoto, non viene eseguita alcuna gestione temporanea e gli aggiornamenti vengono applicati in base alle altre norme del dispositivo.
-
-      Questa norma non viene applicata agli switch del canale.</translation>
 <translation id="7295019613773647480">Attiva utenti supervisionati</translation>
 <translation id="7301543427086558500">Specifica un elenco di URL alternativi che possono essere utilizzati per estrarre termini di ricerca dal motore di ricerca. Gli URL devono contenere la stringa <ph name="SEARCH_TERM_MARKER" />, che verrà utilizzata per estrarre i termini di ricerca.
 
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index 7701fae..f2616a9 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -2167,15 +2167,6 @@
 
           אם הגדרה זו מושבתת, תכונה זו לא תהיה זמינה.</translation>
 <translation id="7275334191706090484">סימניות מנוהלות</translation>
-<translation id="729492886167634859">‏המדיניות הזו מגדירה רשימה של ערכי אחוזים. ערכי האחוזים האלה קובעים את שיעור מכשירי <ph name="PRODUCT_OS_NAME" />  ביחידה הארגונית שיש לעדכן בכל שבוע, החל מהיום שבו המערכת מאתרת לראשונה את העדכון. האיתור נעשה במועד מאוחר מזה שבו פורסם העדכון, כי יכול לחלוף זמן מרגע פרסום העדכון ועד שהמכשיר מחפש עדכונים.
-
-      ערך n ברשימה מציין את אחוז המכשירים שישלימו עדכון גרסה בשבוע ה-n לאחר איתור העדכון. לדוגמה, אם עדכון יאותר היום, הערך הראשון ברשימה מגדיר את אחוז המכשירים ביחידה הארגונית שיעודכנו לגרסה הזו בתוך שבוע מהיום. הערך השני מגדיר את אחוז המכשירים ביחידה הארגונית שיעודכנו לגרסה הזו בתוך שבועיים מהיום, וכן הלאה.
-
-      אם הוגדר ערך בשביל המדיניות הזו, עדכונים יתעלמו מהמדיניות <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ויפעלו לפי המדיניות הזו.
-
-      אם הרשימה הזו ריקה, אין שלבי ביניים והעדכונים יוחלו בהתאם לסעיפים האחרים של מדיניות המכשיר.
-
-      המדיניות הזו לא חלה על מעבר לערוץ אחר.</translation>
 <translation id="7295019613773647480">הפעלת משתמשים בפיקוח</translation>
 <translation id="7301543427086558500">‏מדיניות זו מגדירה רשימה של כתובות אתרים חלופיות שיכולות לשמש לחילוץ מונחי חיפוש ממנוע החיפוש. כתובות האתרים יכילו את המחרוזת <ph name="SEARCH_TERM_MARKER" />, שתשמש לחילוץ מונחי החיפוש.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 284e3f99..b65467cf 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -2176,15 +2176,6 @@
 
           この設定が無効な場合、この機能は利用できません。</translation>
 <translation id="7275334191706090484">管理対象のブックマーク</translation>
-<translation id="729492886167634859">このポリシーでは、アップデートが最初に検出された日から 1 週間ごとに更新する OU 内の <ph name="PRODUCT_OS_NAME" /> 端末の割合をリストで定義します。アップデートが公開されてから端末で検出されるまで少し時間がかかるため、アップデートの検出時間は公開時間より後になります。
-
-      リストの n 番目の値は、アップデートが検出されてから n 週目に次のバージョンに更新する端末の割合を示します。たとえば、アップデートが今日検出された場合、リストの 1 番目の値は、今日から 1 週目にそのバージョンに更新する OU 内の端末の割合を示します。2 番目の値は、今日から 2 週目にそのバージョンに更新する OU 内の端末の割合を示します。以降も同様です。
- 
-      このポリシーで値が定義されている場合、アップデートは <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ポリシーを無視して、このポリシーに沿って行われます。
-
-      このポリシーが空白の場合、段階的な適用は行われず、アップデートは他のデバイス ポリシーに沿って適用されます。
-
-      このポリシーはチャンネルの切り替えには適用されません。</translation>
 <translation id="7295019613773647480">監視対象ユーザーを有効にする</translation>
 <translation id="7301543427086558500">検索エンジンからの検索キーワードの抽出に使用できる代替 URL のリストを指定します。URL には文字列 <ph name="SEARCH_TERM_MARKER" /> が含まれている必要があります。この文字列は検索キーワードの抽出に使用されます。
 
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index 9b142eb..d24faa9 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -2358,17 +2358,6 @@
       ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, Smart Lock ಬಳಸಲು ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ.
 
       ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ, ಎಂಟರ್‌ಪ್ರೈಸ್-ನಿರ್ವಹಿತ ಬಳಕೆದಾರರಿಗೆ ಡಿಫಾಲ್ಟ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ನಿರ್ವಹಿಸದ ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ.</translation>
-<translation id="729492886167634859">ಮೊದಲ ಬಾರಿಗೆ ಅಪ್‌ಡೇಟ್ ಕಂಡುಹಿಡಿಯಲ್ಪಟ್ಟ ದಿನಾಂಕದಿಂದ ಪ್ರತಿ ವಾರ OU ನಲ್ಲಿ ಸ್ಥಾಪಿಸಬಹುದಾದ <ph name="PRODUCT_OS_NAME" /> ಸಾಧನಗಳ ಶೇಕಡಾವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ ಶೇಕಡಾವಾರು ಪಟ್ಟಿಯನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಈ ನೀತಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಅಪ್‌ಡೇಟ್ ಪ್ರಕಟಗೊಂಡ ದಿನಾಂಕ ಅಪ್‌ಡೇಟ್ ಬಿಡುಗಡೆಯ ದಿನಾಂಕದ ನಂತರ ಇರುತ್ತದೆ, ಏಕೆಂದರೆ ಅಪ್‌ಡೇಟ್ ಬಿಡುಗಡೆಗೊಂಡ ನಂತರ ಸಾಧನವನ್ನು ಪರಿಶೀಲಿಸಲು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು.
-
-
-       ಪಟ್ಟಿಯಲ್ಲಿ ಕಂಡುಬರುವ nನೇ ಮೌಲ್ಯವು ಅಪ್‌ಡೇಟ್ ಕಂಡುಬಂದ ನಂತರ n-ನೇ ವಾರದೊಳಗೆ ಹೊಸ ಆವೃತ್ತಿಗೆ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದಾದ ಸಾಧನಗಳ ಶೇಕಡಾವನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಒಂದು ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಇಂದು ಪತ್ತೆಹಚ್ಚಿದಲ್ಲಿ, ಪಟ್ಟಿಯ ಮೊದಲ ಮೌಲ್ಯವು OU ನಲ್ಲಿನ ಸಾಧನಗಳ ಶೇಕಡಾವಾರು ಆಗಿದ್ದು,  ಉದಾಹರಣೆಗೆ, ಸಿಸ್ಟಮ್ ಇಂದು ಒಂದು ಅಪ್‌ಡೇಟ್‌ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದರೆ, ಇಂದಿನಿಂದ ಒಂದು ವಾರದವರೆಗೆ ಸಂಸ್ಥೆಯಲ್ಲಿ ಅಳವಡಿಸಬೇಕಾದ ಶೇಕಡಾವಾರು ಸಾಧನಗಳನ್ನು ಈ ಪಟ್ಟಿಯಲ್ಲಿರುವ ಮೊದಲ ಮೌಲ್ಯವು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಎರಡನೆಯ ಮೌಲ್ಯವು OU ನಲ್ಲಿನ ಸಾಧನಗಳ ಶೇಕಡಾವಾರು ಪ್ರಮಾಣವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ ಅದು ಇಂದಿನಿಂದ 2 ವಾರಗಳವರೆಗೆ ಆ ಆವೃತ್ತಿಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕು ಮತ್ತು ಹೀಗೆ ಮಾಡಬಹುದು
-
-      ಈ ನೀತಿಯ ಮೌಲ್ಯವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿದ್ದರೆ, ಅಪ್‌ಡೇಟ್ <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ ಮತ್ತು ಬದಲಿಗೆ ಈ ನೀತಿಯನ್ನು ಅನುಸರಿಸುತ್ತದೆ.
-
-      ಈ ಪಟ್ಟಿಯು ಖಾಲಿಇದ್ದರೆ, ಈ ಪಟ್ಟಿಯು ಖಾಲಿಯಾಗಿದ್ದರೆ, ಯಾವುದೇ ಹಂತಗಳು ನಡೆಯುವುದಿಲ್ಲ ಮತ್ತು ಇತರ ಸಾಧನಗಳ ನೀತಿಗಳ ಪ್ರಕಾರ ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.
-
-
-      ಈ ನೀತಿಯು ಚಾನಲ್ ಸ್ವಿಚ್‌ಗಳಿಗೆ ಅನ್ವಯಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="7295019613773647480">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="7301543427086558500">ಹುಡುಕಾಟ ಎಂಜಿನ್‌ನಿಂದ ಹುಡುಕಾಟ ಪದಗಳನ್ನು ಬೇರ್ಪಡಿಸಲು ಬಳಸಬಹುದಾದ ಪರ್ಯಾಯ URL ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಹುಡುಕಾಟ ಪದಗಳನ್ನು ಬೇರ್ಪಡಿಸಲು ಬಳಸುವಂತಹ, URL ಗಳು <ph name="SEARCH_TERM_MARKER" /> ಸ್ಟ್ರಿಂಗ್ ಒಳಗೊಂಡಿರಬೇಕು.
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 3c32fce..666782d 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -2271,15 +2271,6 @@
 
           이 설정이 사용 중지되면 이 기능을 사용할 수 없습니다.</translation>
 <translation id="7275334191706090484">관리 북마크</translation>
-<translation id="729492886167634859">이 정책은 OU에 있는 <ph name="PRODUCT_OS_NAME" /> 기기의 일부를 정의하는 비율의 목록을 정의하여 업데이트가 처음 발견된 날부터 매주 업데이트합니다. 업데이트가 게시된 후 기기가 업데이트를 확인할 때까지 시간이 다소 걸리므로 발견 시간은 업데이트 게시 시간 이후입니다.
-
-      목록의 n번째 값은 업데이트가 발견된 후 n주 이내에 다음 버전으로 업데이트를 완료해야 하는 기기의 비율로 사용됩니다. 예를 들어 업데이트가 오늘 발견되었다면 목록의 첫 번째 값은 OU에서 오늘부터 1주 이내에 해당 버전으로 업데이트되어야 하는 기기의 비율을 정의합니다. 두 번째 값은 OU에서 오늘부터 2주 이내에 해당 버전으로 업데이트되어야 하는 기기의 비율을 정의합니다.
-
-      정책에 값이 정의되어 있다면 업데이트는 <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> 정책을 무시하고 이 정책을 대신 따릅니다.
-
-      목록이 비어 있다면 스테이징이 이루어지지 않으며 다른 기기 정책에 따라 업데이트가 적용됩니다.
-
-      이 정책은 채널 전환에 적용되지 않습니다.</translation>
 <translation id="7295019613773647480">관리 대상 사용자를 사용하도록 설정</translation>
 <translation id="7301543427086558500">검색 엔진에서 검색어를 추출하는 데 사용할 수 있는 대체 URL 목록을 지정합니다. URL은 검색어 추출에 사용되는 <ph name="SEARCH_TERM_MARKER" /> 문자열을 포함해야 합니다.
 
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index e507bb0f5..193bba61 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -2279,15 +2279,6 @@
 
           Jei šis nustatymas neleidžiamas, ši funkcija nepasiekiama.</translation>
 <translation id="7275334191706090484">Tvarkomos žymės</translation>
-<translation id="729492886167634859">Ši politika apibrėžia procentinių verčių sąrašą, kur nurodoma OV įrenginių dalis („<ph name="PRODUCT_OS_NAME" />“), kurie bus atnaujinti per savaitę nuo pirmos naujinio aptikimo dienos. Aptikimo laikas yra vėlesnis nei naujinio paskelbimo laikas, nes paskelbus naujinį įrenginys gali tikrinti, ar yra naujinių, tik po kurio laiko.
-
-      N-toji sąrašo vertė bus naudojama kaip procentinė įrenginių dalis, kurių sistema turėtų būti atnaujinta į naują versiją n-tąją savaitę po naujinio aptikimo. Pvz., jei naujinys aptiktas šiandien, pirma sąrašo vertė nurodys procentinę OV įrenginių dalį, kurių sistema turėtų būti atnaujinta į naują versiją per savaitę nuo šiandien. Antra vertė nurodo procentinę OV įrenginių dalį, kurių sistema turėtų būti atnaujinta į tą versiją per dvi savaites nuo šiandien ir t. t.
-
-      Jei šios politikos vertė nustatyta, naujiniai nepaisys politikos „<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />“ ir vietoje to atsižvelgs į šią politiką.
-
-      Jei šis sąrašas tuščias, etapinis diegimas nebus naudojamas, o naujiniai bus pritaikyti atsižvelgiant į kitas įrenginių politikos nuostatas.
-
-      Ši politika netaikoma keičiant kanalus.</translation>
 <translation id="7295019613773647480">Įgalinti prižiūrimus naudotojus</translation>
 <translation id="7301543427086558500">Nurodomas alternatyvių URL, kuriuos galima naudoti paieškos terminams iš paieškos variklio gauti, sąrašas. URL turėtų būti eilutė „<ph name="SEARCH_TERM_MARKER" />“, kuri bus naudojama paieškos terminams gauti.
 
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index d195824c..164fb30c 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -2275,15 +2275,6 @@
 
           Ja šis iestatījums ir atspējots, šī funkcija nebūs pieejama.</translation>
 <translation id="7275334191706090484">Pārvaldītās grāmatzīmes</translation>
-<translation id="729492886167634859">Šī politika nosaka procentuālo daļu sarakstu, kas tiks izmantots to OV <ph name="PRODUCT_OS_NAME" /> ierīču procentuālās daļas definēšanai, kuras tiek atjauninātas katrā nedēļā, sākot no dienas, kad tiek konstatēts atjauninājums. Atjauninājums tiek konstatēts pēc tā publicēšanas, jo, iespējams, paiet laiks no atjauninājuma publicēšanas brīža līdz brīdim, kad ierīcē tiek pārbaudīta atjauninājumu pieejamība.
-
-      Saraksta n-tā vērtība tiks izmantota kā to ierīču procentuālā daļa, kurai jāpabeidz atjaunināšana uz nākamo versiju n-tajā nedēļā pēc atjauninājuma konstatēšanas. Piemēram, ja atjauninājums tiek konstatēts šodien, saraksta pirmā vērtība definē to OV ierīču procentuālo daļu, kuras jāatjaunina uz šo versiju nedēļas laikā kopš šodienas. Otrā vērtība definē to OV ierīču procentuālo daļu, kuras jāatjaunina uz šo versiju 2 nedēļu laikā kopš šodienas utt.
-
-      Ja politikai būs definēta vērtība, atjauninājumi ignorēs politiku “<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />” un tās vietā ievēros šo politiku.
-
-      Ja šis saraksts būs tukšs, pakāpeniska atjaunināšana netiks piemērota un atjaunināšana tiks veikta saskaņā ar citām ierīces politikām.
-
-      Šī politika netiek lietota kanālu pārslēgšanai.</translation>
 <translation id="7295019613773647480">Iespējot uzraudzītos lietotājus</translation>
 <translation id="7301543427086558500">Tiek norādīts to alternatīvo vietrāžu URL saraksts, kurus var izmantot meklēšanas vienumu izgūšanai no meklētājprogrammas. Vietrāžos URL ir jābūt ietvertai virknei <ph name="SEARCH_TERM_MARKER" />, kas tiek izmantota meklēšanas vienumu izgūšanai.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 0318135..de6c7f6 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -2545,15 +2545,6 @@
       നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിൽ, Smart Lock ഉപയോഗിക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കില്ല. 
 
       ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, എന്റർപ്രൈസ്-നിയന്ത്രിത ഉപയോക്താക്കളെ സ്ഥിരമായവ ഉപയോഗിക്കാൻ അനുവദിക്കാതിരിക്കുകയും മാനേജുചെയ്യപ്പെടാത്ത ഉപയോക്താക്കളെ അനുവദിക്കുകയും ചെയ്യും.</translation>
-<translation id="729492886167634859">അപ്‌ഡേറ്റ് ആദ്യം കണ്ടെത്തിയ ദിവസം മുതലുള്ള ഓരോ ആഴ്‌ചയിലും അപ്‌ഡേറ്റ് ചെയ്യാനുള്ള, OU-വിലെ <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങളുടെ ഒരു ഭാഗത്തെ നിർവചിക്കുന്ന ശതമാനങ്ങളുടെ ഒരു ലിസ്‌റ്റിനെ ഈ നയം നിർവചിക്കുന്നു. അപ്‌ഡേറ്റ് പ്രസിദ്ധീകരിച്ച് അൽപ്പസമയത്തിന് ശേഷമാവും ഉപകരണം അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുക എന്നതിനാൽ, അപ്‌ഡേറ്റ് കണ്ടെത്തിയ സമയം അത് പ്രസിദ്ധീകരിച്ചതിന് ശേഷമുള്ളതായിരിക്കും.
-
-      അപ്‌ഡേറ്റ് കണ്ടെത്തിയതിന് ശേഷമുള്ള n സ്ഥാനത്തുള്ള ആഴ്‌ചയിൽ അടുത്ത പതിപ്പിലേക്കുള്ള അപ്‌ഡേറ്റ് പൂർത്തിയാക്കേണ്ട ഉപകരണങ്ങളുടെ ശതമാനമായി ഈ ലിസ്‌റ്റിലെ n സ്ഥാനത്തുള്ള മൂല്യം ഉപയോഗിക്കും. ഉദാഹരണത്തിന്, ഇന്ന് ഒരു അപ്‌ഡേറ്റ് കണ്ടെത്തിയാൽ, ഒരാഴ്‌ച്ചയ്‌ക്കകം ആ പതിപ്പിലേക്ക് അപ്‌ഡേറ്റ് ചെയ്യേണ്ട, OU-വിലെ ഉപകരണങ്ങളുടെ ശതമാനത്തെ ലിസ്‌റ്റിലെ ആദ്യ മൂല്യം നിർവചിക്കുന്നു. 2 ആഴ്‌ചയ്‌ക്കകം ആ പതിപ്പിലേക്ക് അപ്‌ഡേറ്റ് ചെയ്യേണ്ട, OU-ലെ ഉപകരണങ്ങളുടെ ശതമാനത്തെ രണ്ടാമത്തെ മൂല്യം നിർവചിക്കുന്നു, ഇതേ രീതി തുടരുകയും ചെയ്യുന്നു.
-
-      ഈ നയത്തിനായി ഒരു മൂല്യം നിർവചിച്ചിട്ടുണ്ടെങ്കിൽ, അപ്‌ഡേറ്റുകൾ <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> എന്ന നയം അവഗണിക്കുകയും പകരം ഈ നയം പിന്തുടരുകയും ചെയ്യും.
-
-      ഈ ലിസ്‌റ്റ് ശൂന്യമാണെങ്കിൽ, സ്‌റ്റേജിംഗ് ഉണ്ടാവില്ല, മറ്റ് ഉപകരണ നയങ്ങൾ അനുസരിച്ച് അപ്‌ഡേറ്റുകൾ ബാധകമാക്കുകയും ചെയ്യും.
-
-      ചാനൽ സ്വിച്ചുകൾക്ക് ഈ നയം ബാധകമാവില്ല.</translation>
 <translation id="7295019613773647480">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താക്കളെ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="7301543427086558500">തിരയൽ എഞ്ചിനിൽ നിന്നുമുള്ള തിരയൽ പദങ്ങൾ എക്‌‌സ്‌ട്രാക്റ്റുചെയ്യുന്നതിന് ഉപയോഗിക്കുന്ന ഇതര URL-കളുടെ ലിസ്റ്റ് നിർദ്ദേശിക്കുന്നു. തിരയൽ പദങ്ങൾ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുന്നതിന് ഉപയോഗിക്കുന്ന സ്‌ട്രിംഗ് <ph name="SEARCH_TERM_MARKER" /> URL-കളിൽ അടങ്ങിയിരിക്കണം.
 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 1535ac48..c11e5bd 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -326,6 +326,11 @@
       सेटिंग अनिर्दिष्ट करता सोडल्यास, डीफॉल्ट मूल्य वापरले जाते.
 
       हे धोरण सेट न करता सोडल्यास, सर्व सेटिंग्जसाठी डीफॉल्ट वापरले जातात.</translation>
+<translation id="1958138414749279167"><ph name="PRODUCT_NAME" /> चे ऑटोफिल वैशिष्ट्य सुरू करते आणि यापूर्वी स्टोअर केलेली माहिती वापरून वापरकर्त्यांना वेब फॉर्म आणि पत्ता माहिती आपोआप पूर्ण करण्याची अनुमती देते.
+
+      हे सेटिंग बंद केल्यास, ऑटोफिल कधीही पत्ता माहिती सुचवणार किंवा भरणार नाही तसेच ब्राउझ करत असताना वापरकर्त्याने कदाचित सबमिट केलेली अतिरिक्त पत्त्याची माहिती ते सेव्ह करणार नाही.
+
+      हे सेटिंग सुरू केल्यास किंवा मूल्य नसल्यास, वापरकर्त्याला UI मध्ये पत्त्यांसाठी ऑटोफिल नियंत्रित करता येईल.</translation>
 <translation id="1960840544413786116">स्थानिक विश्वासू अँकरनी जारी केलेल्या subjectAlternativeName विस्तार गहाळ असलेल्या प्रमाणप‍त्रांना अनुमती द्यावी किंवा देऊ  नये</translation>
 <translation id="1964634611280150550">गुप्त मोड अक्षम</translation>
 <translation id="1964802606569741174">या धोरणाचा Android YouTube अॅपवर प्रभाव नसतो. YouTube वर सुरक्षितता मोडची सक्ती केल्यास, Android YouTube अॅपच्या स्थापनेची अनुमती रद्द केली जावी.</translation>
@@ -2133,6 +2138,7 @@
 <translation id="6440051664870270040">साइटना एकाचवेळी नेव्हिगेट करण्याची आणि पॉप-अप उघडण्याची अनुमती देते</translation>
 <translation id="6447948611083700881">बॅकअप आणि रिस्टोअर बंद केले आहे</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> साठी सक्तीने साइन इन सुरू करा</translation>
+<translation id="6464074037294098618">पत्त्यांसाठी ऑटोफिल सुरू करा</translation>
 <translation id="6467613372414922590">वापरकर्ता-स्तर मूळ संदेशन होस्टला (प्रशासनाच्या परवानग्यांशिवाय इंस्टॉल केलेले) अनुमती द्या</translation>
 <translation id="6468980648680553776">हे धोरण बहिष्कृत केले आहे. कृपया त्याऐवजी RemoteAccessHostClientDomainList वापरा.</translation>
 <translation id="6473623140202114570">सुरक्षित ब्राउझिंग चेतावणी ट्रिगर करणार नाही अशा डोमेनची सूची कॉन्फिगर करा.</translation>
@@ -2510,15 +2516,6 @@
      तुम्ही ही सेटिंग बंद केल्यास, वापरकर्त्यांना Smart Lock वापरू दिले जाणार नाही.
 
      हे धोरण सेट न करता सोडल्यास, एंटरप्राइझ-व्यवस्थापित वापरकर्त्यांसाठी डीफॉल्ट अनुमत नसेल आणि व्यवस्थापित न केलेल्या वापरकर्त्यांसाठी त्याची अनुमती असेल.</translation>
-<translation id="729492886167634859">हे धोरण टक्केवारीची सूची निर्धारित करते, जी पहिल्यांदा अपडेट शोधले त्या दिवसापासून सुरू होऊन दर आठवड्याला अपडेट करण्यासाठी OU मधील <ph name="PRODUCT_OS_NAME" /> डिव्हाइसचा अंश निर्धारित करेल.अपडेट शोधल्याची वेळ ही प्रकाशित केलेल्या वेळेनंतरची असते, कारण अपडेट शोधून ते प्रकाशित करेपर्यंत थोडा लागू शकतो.
-
-      सूचीतील पुढील मूल्य डिव्हाइसची टक्केवारी म्हणून वापरले जाईल ज्याचे अपडेट शोधल्यानंतरच्या पुढील आठवड्यात पुढील आवृत्तीवर अपडेट होणे आवश्यक आहे. उदाहरणार्थ,  एखादे अपडेट आज शोधल्यास, सूचीतील पहिले मूल्य हे OU मधील डिव्हाइसची टक्केवारी निर्धारित करते जी आजपासून एका आठवड्याच्या आत त्या आवृत्तीवर अपडेट होणे आवश्यक आहे. दुसरे मूल्य हे OU मधील डिव्हाइसची टक्केवारी निर्धारित करते जी आजपासून दोन आठवड्याच्या आत त्या आवृत्तीवर अपडेट होणे आवश्यक आहे.
-
-      या धोरणासाठी एखादे मूल्य निर्धारित केले असल्यास, अपडेट <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> धोरणाकडे दुर्लक्ष करतील आणि त्याऐवजी या धोरणाचे पालन करतील.
-
-      ही सूची रिकामी असल्यास,  कोणतेही स्टेजिंग नसेल आणि इतर डिव्हाइस धोरणांनुसार अपडेट लागू केले जातील.
-
-      हे धोरण चॅनेल स्विचसाठी लागू होत नाही.</translation>
 <translation id="7295019613773647480">पर्यवेक्षी वापरकर्ते सक्षम करा</translation>
 <translation id="7301543427086558500">शोध इंजिनमधून शोध संज्ञा विस्तृत करण्यासाठी वापरल्या जाऊ शकणाऱ्या वैकल्पिक URLs ची एक सूची निर्दिष्ट करते. URLs मध्ये <ph name="SEARCH_TERM_MARKER" /> स्ट्रींग असावी, जी शोध संज्ञा विस्तृत करण्यासाठी वापरली जाईल.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index d13b796b..116aec6 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -302,6 +302,11 @@
       Jika tetapan dibiarkan tanpa ditentukan, nilai lalai akan digunakan.
 
       Jika dasar ini tidak ditetapkan, nilai lalai akan digunakan untuk semua tetapan.</translation>
+<translation id="1958138414749279167">Mendayakan ciri Autolengkap <ph name="PRODUCT_NAME" /> dan membolehkan pengguna melengkapkan maklumat alamat dalam borang web secara automatik dengan menggunakan maklumat yang disimpan sebelum ini.
+
+      Jika tetapan ini dilumpuhkan, Autolengkap tidak akan mencadangkan atau mengisikan maklumat alamat mahupun menyimpan maklumat alamat tambahan yang mungkin diserahkan oleh pengguna semasa menyemak imbas web.
+
+      Jika tetapan ini didayakan atau tiada nilai, pengguna akan dapat mengawal ciri Autolengkap untuk alamat dalam UI.</translation>
 <translation id="1960840544413786116">Sama ada hendak membenarkan sijil yang dikeluarkan oleh pengukuhan kepercayaan setempat yang tiasa sambungan subjectAlternativeName</translation>
 <translation id="1964634611280150550">Mod Inkognito dilumpuhkan</translation>
 <translation id="1964802606569741174">Dasar ini tidak berkesan terhadap apl YouTube Android. Jika Mod Keselamatan pada YouTube harus dikuatkuasakan, pemasangan apl YouTube Android tidak boleh dibenarkan.</translation>
@@ -1921,6 +1926,7 @@
 <translation id="6440051664870270040">Benarkan tapak menavigasi dan membuka tetingkap timbul secara serentak</translation>
 <translation id="6447948611083700881">Sandaran dan pemulihan dilumpuhkan</translation>
 <translation id="645425387487868471">Dayakan log masuk paksa untuk <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Dayakan Autolengkap untuk alamat</translation>
 <translation id="6473623140202114570">Konfigurasikan senarai domain tempat Penyemakan Imbas Selamat tidak akan mencetuskan amaran.</translation>
 <translation id="6491139795995924304">Benarkan bluetooth pada peranti</translation>
 <translation id="6520802717075138474">Import enjin carian daripada penyemak imbas lalai pada kali pertama menjalankannya</translation>
@@ -2276,15 +2282,6 @@
 
           Jika tetapan ini dilumpuhkan, maka ciri ini tidak akan tersedia.</translation>
 <translation id="7275334191706090484">Penanda Halaman Terurus</translation>
-<translation id="729492886167634859">Dasar ini mentakrifkan senarai peratusan yang akan menentukan pecahan peranti <ph name="PRODUCT_OS_NAME" /> dalam OU yang akan dikemas kini setiap minggu bermula dari hari kemas kini itu mula-mula ditemui. Masa penemuan adalah lebih kemudian daripada masa kemas kini diterbitkan memandangkan peranti menyemak kemas kini beberapa ketika selepas kemas kini itu diterbitkan.
-
-      Nilai ke-n dalam senarai akan digunakan sebagai peratusan peranti yang harus selesai dikemas kini kepada versi seterusnya dalam minggu ke-n selepas kemas kini ditemui. Sebagai contoh, jika kemas kini ditemui pada hari ini, maka nilai pertama dalam senarai mentakrifkan peratusan peranti dalam OU yang perlu dikemas kini kepada versi itu dalam masa seminggu dari hari ini. Nilai kedua mentakrifkan peratusan peranti dalam OU yang harus dikemas kini kepada versi itu dalam masa 2 minggu dari hari ini dan seterusnya.
-
-      Jika terdapat nilai yang ditakrifkan untuk dasar ini, kemas kini akan mengabaikan dasar <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> dan mengikut dasar ini.
-
-      Jika senarai ini kosong, tidak akan ada pemeringkatan dan kemas kini akan dibuat mengikut dasar peranti lain.
-
-      Penukaran saluran tidak tertakluk pada dasar ini.</translation>
 <translation id="7295019613773647480">Dayakan pengguna diselia</translation>
 <translation id="7301543427086558500">Menetapkan senarai URL ganti yang boleh digunakan untuk mengeluarkan istilah carian daripada enjin carian. URL harus mengandungi rentetan <ph name="SEARCH_TERM_MARKER" />, yang akan digunakan untuk menyari istilah carian.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 54a52f4..24f2f80 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -294,6 +294,11 @@
       Als een instelling niet wordt gespecificeerd, wordt een standaardwaarde gebruikt.
 
       Als het instellen van dit beleid ongedaan wordt gemaakt, worden de standaardwaarden gebruikt voor alle instellingen.</translation>
+<translation id="1958138414749279167">Hiermee wordt de functie 'Automatisch aanvullen' van <ph name="PRODUCT_NAME" /> ingeschakeld zodat gebruikers adresgegevens automatisch kunnen invullen op webformulieren aan de hand van eerder opgeslagen gegevens.
+
+      Als deze instelling is uitgeschakeld, worden er nooit adresgegevens voorgesteld of ingevuld door 'Automatisch aanvullen'. Er worden ook geen aanvullende adresgegevens opgeslagen die de gebruiker mogelijk verzendt terwijl deze browset op internet.
+
+      Als deze instelling is ingeschakeld of er geen waarde is ingesteld, kan de gebruiker 'Automatisch aanvullen' voor adressen beheren in de UI.</translation>
 <translation id="1960840544413786116">Of door lokale vertrouwensankers uitgegeven certificaten zonder de extensie subjectAlternativeName zijn toegestaan</translation>
 <translation id="1964634611280150550">Incognitomodus uitgeschakeld</translation>
 <translation id="1964802606569741174">Dit beleid is niet van invloed op de YouTube-app voor Android. Als de veiligheidsmodus voor YouTube moet worden afgedwongen, moet je installatie van de YouTube-app voor Android niet toestaan.</translation>
@@ -1908,6 +1913,7 @@
 <translation id="6440051664870270040">Toestaan dat sites tegelijkertijd kunnen navigeren en pop-ups kunnen openen</translation>
 <translation id="6447948611083700881">Back-up maken en terugzetten uitgeschakeld</translation>
 <translation id="645425387487868471">Gedwongen inloggen voor <ph name="PRODUCT_NAME" /> inschakelen</translation>
+<translation id="6464074037294098618">Automatisch aanvullen voor adressen inschakelen</translation>
 <translation id="6473623140202114570">Configureer de lijst met domeinen waar Safe Browsing geen waarschuwingen activeert.</translation>
 <translation id="6491139795995924304">Bluetooth toestaan op apparaat</translation>
 <translation id="6520802717075138474">Zoekmachines importeren uit standaardbrowser bij eerste uitvoering</translation>
@@ -2253,15 +2259,6 @@
 
           Als deze instelling is uitgeschakeld, is deze functie niet beschikbaar.</translation>
 <translation id="7275334191706090484">Beheerde bladwijzers</translation>
-<translation id="729492886167634859">Dit beleid definieert een lijst van percentages. Deze percentages bepalen welk deel van <ph name="PRODUCT_OS_NAME" />-apparaten in de OE per week moet worden geüpdatet vanaf de dag waarop de update voor het eerst wordt ontdekt. De update wordt later ontdekt dan deze wordt gepubliceerd, aangezien het even kan duren voordat het apparaat controleert op updates.
-
-      De n-de waarde in de lijst wordt gebruikt als het percentage apparaten dat moet worden geüpdatet naar de volgende versie in de n-de week nadat de update voor het eerst wordt ontdekt. Als een update bijvoorbeeld vandaag wordt ontdekt, bepaalt de eerste waarde in de lijst welk percentage apparaten in de OE binnen een week moet worden geüpdatet naar die versie. De tweede waarde bepaalt het percentage apparaten in de OE dat naar die versie moet worden geüpdatet binnen twee weken vanaf vandaag, enzovoort.
-
-      Als er voor dit beleid een waarde is ingesteld, negeren updates het beleid <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> en wordt in plaats daarvan dit beleid gevolgd.
-
-      Als deze lijst leeg is, vindt het updaten niet gefaseerd plaats en worden updates toegepast volgens ander apparaatbeleid.
-
-      Dit beleid is niet van toepassing op kanaalwisselingen.</translation>
 <translation id="7295019613773647480">Gebruikers met beperkte rechten inschakelen</translation>
 <translation id="7301543427086558500">Hiermee wordt een lijst met alternatieve URL's gespecificeerd die kunnen worden gebruikt om zoektermen uit de zoekmachine te extraheren. De URL's moeten de tekenreeks <ph name="SEARCH_TERM_MARKER" /> bevatten die wordt gebruikt om de zoektermen te extraheren.
 
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index 9b3ad68b..5b92b673 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -1152,6 +1152,15 @@
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettstedene, enten fra regelen «DefaultKeygenSetting» hvis den er angitt, eller fra brukerens personlige konfigurasjon.</translation>
 <translation id="4239720644496144453">Bufferen brukes ikke til Android-apper. Hvis flere brukere installerer den samme Android-appen, blir den lastet ned på nytt for hver bruker.</translation>
+<translation id="4243336580717651045">Aktiverer anonymisert datainnsamling med nettadressenøkkel i <ph name="PRODUCT_NAME" />,  hindrer brukerne i å endre denne innstillingen. 
+
+      Anonymisert datainnsamling med nettadressenøkkel sender nettadressene til sidene som brukeren besøker til Google, for å muliggjøre bedre søk og surfing på nett.
+
+      Hvis denne retningslinjen aktiveres, vil anonymisert datainnsamling med nettadressenøkkel alltid være aktiv.
+
+     Hvis denne retningslinjen deaktiveres, vil anonymisert datainnsamling med nettadressenøkkel aldri være aktiv.
+
+      Hvis denne retningslinjen ikke angis, vil anonymisert datainnsamling med nettadressenøkkel være aktivert, men brukeren kan endre på det.</translation>
 <translation id="4250680216510889253">Nei</translation>
 <translation id="4261820385751181068">Lokalitet for påloggingsskjermen på enheten</translation>
 <translation id="427220754384423013">Angir skriverne som en bruker kan bruke.
@@ -1807,6 +1816,7 @@
           Den anbefalte måten å låse skjermen på når den er inaktiv, er å aktivere skjermlåsing ved hvilemodus, slik at <ph name="PRODUCT_OS_NAME" /> aktiverer skjermlåsen etter det innstilte inaktive perioden. Tidsinnstillingen for skjermlåsen bør bare brukes når skjermlåsen skal aktiveres lenge før hvilemodus, eller når bruk av hvilemodus ved inaktivitet ikke er ønskelig i det hele tatt.
 
           Innstillingsverdien bør angis i millisekunder. Verdien må være mindre enn inaktivitetsforsinkelsen.</translation>
+<translation id="6097601282776163274">Aktiver anonymisert datainnsamling med nettadressenøkkel</translation>
 <translation id="6111936128861357925">Tillat dinosaurspill-påskeegget</translation>
 <translation id="6114416803310251055">avskrevet</translation>
 <translation id="6133088669883929098">Tillat alle nettsteder å bruke nøkkelgenerering</translation>
@@ -2242,17 +2252,6 @@
 
           Hvis denne innstillingen er deaktivert, er ikke funksjonen tilgjengelig.</translation>
 <translation id="7275334191706090484">Administrerte bokmerker</translation>
-<translation id="729492886167634859">Disse retningslinjene definerer en liste over prosenter som definerer en brøkdel av <ph name="PRODUCT_OS_NAME" />-enheter i OU for oppdatering i uken fra den dagen oppdateringen oppdages. Oppdagelsestidspunktet er senere enn tidspunktet for publiseringen av oppdateringen, dette siden enheten sjekker etter oppdateringen på visse tidspunkt, noe som kan være en stund etter at oppdateringen er publisert.
-
-      Verdien n-th i listen brukes som prosenten av enheter som bør ha fullført oppdatering til den nyeste versjon i n-th uken etter at oppdateringen har blitt oppdaget. For eksempel, hvis en oppdatering oppdages i dag, vil den første verdien i listen definere prosenten av enheter i OU som bør oppdatere til denne versjonen innen en uke fra i dag. Den andre verdien definerer prosenten av enheter i OU som bør oppdateres til versjonen i løpet av 2 uker fra idag, osv.
-
-   
-      Hvis det en verdi er definert for disse retningslinjene, vil oppdateringen ingorere denne <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />-retningslinjen og følge denne retningslinjen istedet.
-
-
-      Hvis denne listen er tom, vi det ingen fase gjennomføres og oppdateringen vil gjennomføres i henhold til andre enhetsinnstillinger.
-
-      Denne retningslinjen gjelder ikke for andre kanalbrytere.</translation>
 <translation id="7295019613773647480">Aktivér administrerte brukere</translation>
 <translation id="7301543427086558500">Angir en liste over alternative nettadresser som kan brukes til å hente ut søkeord fra søkemotoren. Nettadressene skal inneholde strengen <ph name="SEARCH_TERM_MARKER" />, som brukes til å hente ut søkeordene.
 
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index 3cf8ad2..df4f368 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -292,6 +292,11 @@
       Jeśli jakieś ustawienie pozostanie nieokreślone, obowiązuje wartość domyślna.
 
       Jeśli zasada nie jest włączona, wszystkie ustawienia mają wartości domyślne.</translation>
+<translation id="1958138414749279167">Włącza funkcję Autouzupełniania w <ph name="PRODUCT_NAME" /> i umożliwia użytkownikom automatyczne wprowadzanie wcześniej zapisanych informacji adresowych w formularzach na stronach internetowych.
+
+      Jeśli to ustawienie jest wyłączone, Autouzupełnianie nie będzie podpowiadać ani wypełniać adresu, nie będzie też zapisywać dodatkowych informacji adresowych, które użytkownik może podawać na stronach internetowych.
+
+      Jeśli to ustawienie jest włączone lub nie jest skonfigurowane, użytkownik może samodzielnie skonfigurować Autouzupełnianie adresów w interfejsie.</translation>
 <translation id="1960840544413786116">Określa, czy zezwolić na certyfikaty wydane przez lokalne kotwice zaufania, którym brakuje rozszerzenia subjectAlternativeName</translation>
 <translation id="1964634611280150550">Tryb incognito wyłączony</translation>
 <translation id="1964802606569741174">Ta zasada nie ma wpływu na aplikację YouTube na Androida. Aby wymusić Tryb bezpieczny w YouTube, trzeba uniemożliwić zainstalowanie tej aplikacji.</translation>
@@ -1828,6 +1833,7 @@
 <translation id="6440051664870270040">Zezwalaj stronom na otwieranie wyskakujących okienek podczas nawigowania</translation>
 <translation id="6447948611083700881">Wyłączono tworzenie i przywracanie kopii zapasowej</translation>
 <translation id="645425387487868471">Włącz wymuszone logowanie w: <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Włącz Autouzupełnianie adresów</translation>
 <translation id="6473623140202114570">Skonfiguruj listę domen, w których Bezpieczne przeglądanie nie wywołuje ostrzeżeń.</translation>
 <translation id="6491139795995924304">Włącz Bluetooth na urządzeniu</translation>
 <translation id="6520802717075138474">Importuj wyszukiwarki z przeglądarki domyślnej przy pierwszym uruchomieniu</translation>
@@ -2162,15 +2168,6 @@
 
           Jeśli to ustawienie jest wyłączone, ta funkcja nie będzie dostępna.</translation>
 <translation id="7275334191706090484">Zakładki zarządzane</translation>
-<translation id="729492886167634859">Ta zasada zawiera listę wartości procentowych określających, ile urządzeń z systemem <ph name="PRODUCT_OS_NAME" /> w OU ma być aktualizowanych tygodniowo, począwszy od dnia wykrycia aktualizacji. Moment wykrycia jest późniejszy niż moment opublikowania, ponieważ może minąć trochę czasu pomiędzy opublikowaniem aktualizacji a sprawdzeniem jej dostępności przez urządzenie.
-
-      Kolejne wartości na tej liście określają procent urządzeń, których aktualizacja do nowej wersji powinna zakończyć się w n-tym tygodniu po wykryciu aktualizacji. Na przykład: jeśli aktualizacja zostanie wykryta dzisiaj, pierwsza wartość na tej liście określa procent urządzeń w tej jednostce OU, które powinny zostać zaktualizowane do tej wersji w ciągu tygodnia, licząc od dzisiaj. Druga wartość określa procent urządzeń w tej jednostce OU, które powinny zostać zaktualizowane do tej wersji w ciągu dwóch tygodni, licząc od dzisiaj itd.
-
-      Jeśli zasada zawiera jakąś wartość, aktualizacje będą ignorować zasadę <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> i zamiast niej stosować tę zasadę.
-
-      Jeśli ta lista jest pusta, wdrażanie etapowe nie będzie stosowane, a aktualizacje będą instalowane zgodnie z innymi zasadami dotyczącymi urządzeń.
-
-      Ta zasada nie ma zastosowania do przełączania kanałów.</translation>
 <translation id="7295019613773647480">Włącz obsługę nadzorowanych użytkowników</translation>
 <translation id="7301543427086558500">Określa listę alternatywnych URL-i, które umożliwiają uzyskanie wyników haseł z wyszukiwarki. Adresy URL powinny zawierać łańcuch <ph name="SEARCH_TERM_MARKER" /> używany do wskazania haseł do wyszukania.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index d84051e..43a05d1 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -290,6 +290,11 @@
       Se uma configuração não é especificada, um valor padrão é usado.
 
       Se esta política não é definida, os padrões são usados para todas as configurações.</translation>
+<translation id="1958138414749279167">Ativa o recurso Preenchimento automático do <ph name="PRODUCT_NAME" /> e permite que os usuários preencham automaticamente informações de endereço em formulários da Web usando dados previamente armazenados.
+
+      Se essa configuração estiver desativada, o Preenchimento automático nunca sugerirá ou preencherá informações de endereço, nem salvará outras informações de endereço que o usuário possa enviar ao navegar na Web.
+
+      Se essa configuração estiver ativada ou não tiver um valor definido, o usuário poderá controlar o recurso Preenchimento automático para endereços na IU.</translation>
 <translation id="1960840544413786116">Se os certificados emitidos pelas âncoras de confiança locais que estão sem a extensão subjectAlternativeName devem ser permitidos</translation>
 <translation id="1964634611280150550">Modo de navegação anônima desativado</translation>
 <translation id="1964802606569741174">Esta política não tem nenhum efeito sobre o app do YouTube para Android. Se o modo de segurança do YouTube precisar ser aplicado, a instalação desse app será bloqueada.</translation>
@@ -1827,6 +1832,7 @@
 <translation id="6440051664870270040">Permitir que sites naveguem e abram pop-ups simultaneamente</translation>
 <translation id="6447948611083700881">Backup e restauração desativados</translation>
 <translation id="645425387487868471">Ativar login forçado no <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Ativa o Preenchimento automático de endereços</translation>
 <translation id="6473623140202114570">Configure a lista de domínios em que a política Safe Browsing não acionará avisos.</translation>
 <translation id="6491139795995924304">Permitir o Bluetooth no dispositivo</translation>
 <translation id="6520802717075138474">Importar mecanismos de pesquisa do navegador padrão na primeira execução</translation>
@@ -2167,15 +2173,6 @@
 
           Se esta definição estiver desativada, esse recurso não fica disponível.</translation>
 <translation id="7275334191706090484">Favoritos gerenciados</translation>
-<translation id="729492886167634859">Esta política define uma lista de porcentagens que determina a fração dos dispositivos <ph name="PRODUCT_OS_NAME" /> na UO a ser atualizada semanalmente a partir do dia em que a atualização é descoberta pela primeira vez. A descoberta acontece após a publicação da atualização, já que o dispositivo pode levar um tempo para procurar por atualizações.
-
-      O valor determinado na lista será usado como a porcentagem de dispositivos que devem completar a atualização para a versão seguinte na semana após a descoberta da atualização. Se uma atualização for descoberta hoje, por exemplo, o primeiro valor na lista definirá a porcentagem de dispositivos na UO que devem ser atualizados para a nova versão daqui a uma semana. O segundo valor definirá a porcentagem de dispositivos na UO que devem ser atualizados daqui a duas semanas, e assim sucessivamente.
-
-      Se houver um valor definido para esta política, as atualizações ignorarão a política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguirão esta política.
-
-      Se a lista estiver vazia, não haverá uma fase de testes, e as atualizações serão aplicadas de acordo com outras políticas do dispositivo.
-
-      Esta política não se aplica a trocas de canais.</translation>
 <translation id="7295019613773647480">Ativar usuários supervisionados</translation>
 <translation id="7301543427086558500">Especifica uma lista de URLs alternativos que podem ser usados para extrair termos de pesquisa do mecanismo de pesquisa. Os URLs devem conter a sequência <ph name="SEARCH_TERM_MARKER" />, que será usada para extrair os termos de pequisa.
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index 6255b5b3..fd4247e 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -295,6 +295,11 @@
       Se não especificar uma definição, é utilizado um valor predefinido.
 
       Se não definir esta política, são utilizadas predefinições para todas as definições.</translation>
+<translation id="1958138414749279167">Ativa a funcionalidade de Preenchimento automático do <ph name="PRODUCT_NAME" /> e permite que os utilizadores preencham automaticamente informações de endereços em formulários Web ao utilizar informações armazenadas anteriormente.
+
+      Se esta definição estiver desativada, o Preenchimento automático nunca sugere nem preenche com informações de endereços e também não guarda informações adicionais de endereços que o utilizador possa enviar enquanto navega na Web.
+
+      Se esta definição estiver ativada ou não tiver qualquer valor, o utilizador pode controlar o Preenchimento automático para os endereços na IU.</translation>
 <translation id="1960840544413786116">Se deve ou não autorizar os certificados emitidos por âncoras fidedignas locais que têm a extensão subjectAlternativeName em falta</translation>
 <translation id="1964634611280150550">Modo de navegação anónima desativado</translation>
 <translation id="1964802606569741174">Esta política não tem qualquer efeito na aplicação YouTube para Android. Se for necessário aplicar o modo de segurança no YouTube, a autorização para instalar a aplicação YouTube para Android deve ser removida.</translation>
@@ -1847,6 +1852,7 @@
 <translation id="6440051664870270040">Permitir que os sites naveguem e abram pop-ups em simultâneo</translation>
 <translation id="6447948611083700881">A cópia de segurança e o restauro estão desativados.</translation>
 <translation id="645425387487868471">Ativar o início de sessão forçado no <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Ativar o Preenchimento automático para endereços</translation>
 <translation id="6473623140202114570">Configure a lista de domínios em que a Navegação segura não acionará avisos.</translation>
 <translation id="6491139795995924304">Permitir o Bluetooth no dispositivo</translation>
 <translation id="6520802717075138474">Importar motores de pesquisa a partir do navegador predefinido na primeira execução</translation>
@@ -2188,15 +2194,6 @@
 
           Se esta definição estiver desativada, esta funcionalidade não estará disponível.</translation>
 <translation id="7275334191706090484">Marcadores Geridos</translation>
-<translation id="729492886167634859">Esta política define uma lista de percentagens que definem a fração de dispositivos <ph name="PRODUCT_OS_NAME" /> na UO a atualizar por semana, com início a partir do dia em que a atualização é detetada pela primeira vez. A hora da deteção é posterior à hora da publicação da atualização, uma vez que pode demorar algum tempo após a publicação da atualização até que o dispositivo verifique a existência de atualizações.
-
-      O enésimo valor na lista vai ser utilizado como a percentagem de dispositivos que devem concluir a atualização para a próxima versão na enésima semana após a deteção da atualização. Por exemplo, se uma atualização for detetada hoje, o primeiro valor na lista define a percentagem de dispositivos no UO que devem atualizar para essa versão no prazo de uma semana a partir de hoje. O segundo valor define a percentagem de dispositivos na UO que devem atualizar para essa versão no prazo de duas semanas a partir de hoje, etc.
-
-      Se existir algum valor definido para esta política, as atualizações ignoram a política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguem esta política.
-
-      Se esta lista estiver vazia, as atualizações não são experimentais e são aplicadas de acordo com as outras políticas do dispositivo.
-
-      Esta política não se aplica às mudanças de canais.</translation>
 <translation id="7295019613773647480">Ativar utilizadores supervisionados</translation>
 <translation id="7301543427086558500">Especifica uma lista de URLs alternativos que podem ser utilizados para extrair termos de pesquisa do motor de pesquisa. Os URLs devem conter a cadeia <ph name="SEARCH_TERM_MARKER" />, que será utilizada para extrair os termos de pesquisa.
 
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index d90a204..77bdc1d 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -295,6 +295,11 @@
       Dacă o setare rămâne nespecificată, este utilizată o valoare prestabilită.
 
       Dacă politica nu este configurată, sunt utilizate valorile prestabilite pentru toate setările.</translation>
+<translation id="1958138414749279167">Activează funcția de completare automată din <ph name="PRODUCT_NAME" /> și permite utilizatorilor să completeze automat informațiile despre adrese în formularele web folosind informațiile stocate anterior.
+
+      Dacă această setare este dezactivată, completarea automată nu va sugera și nu va completa niciodată informațiile despre adrese, nici nu va salva informațiile suplimentare despre adrese pe care utilizatorul le-ar putea trimite când navighează pe web.
+
+      Dacă setarea este activată sau nu are nicio valoare, utilizatorul va putea controla funcția de completare automată pentru adrese în interfața de utilizare.</translation>
 <translation id="1960840544413786116">Dacă sunt permise certificatele din care lipsește extensia subjectAlternativeName, emise de ancorele de încredere de pe dispozitiv</translation>
 <translation id="1964634611280150550">Modul incognito a fost dezactivat</translation>
 <translation id="1964802606569741174">Această politică nu afectează aplicația Android YouTube. Dacă trebuie impus Modul sigur pe YouTube, nu trebuie permisă instalarea aplicației Android YouTube.</translation>
@@ -1853,6 +1858,7 @@
 <translation id="6440051664870270040">Permite site-urilor să navigheze și să deschidă ferestre pop-up în același timp</translation>
 <translation id="6447948611083700881">Crearea și restaurarea backupurilor a fost dezactivată</translation>
 <translation id="645425387487868471">Activează conectarea forțată pentru <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Activează completarea automată pentru adrese</translation>
 <translation id="6473623140202114570">Configurează lista de domenii pe care Navigarea sigură nu va declanșa avertismente.</translation>
 <translation id="6491139795995924304">Permite Bluetooth pe dispozitiv</translation>
 <translation id="6520802717075138474">Importați motoarele de căutare din browserul prestabilit, la prima rulare</translation>
@@ -2192,15 +2198,6 @@
 
           Dacă setarea este dezactivată, această funcție nu va fi disponibilă.</translation>
 <translation id="7275334191706090484">Marcaje gestionate</translation>
-<translation id="729492886167634859">Această politică definește o listă de procente care vor defini proporția de dispozitive <ph name="PRODUCT_OS_NAME" /> din UO de actualizat pe săptămână, începând din ziua în care se descoperă actualizarea. Momentul descoperirii apare după momentul publicării actualizării, deoarece este posibil să treacă un timp după publicare până când dispozitivul va căuta actualizări.
-
-      Valoarea „n” din listă va fi folosită ca procent de dispozitive care trebuie să încheie actualizarea la următoarea versiune în săptămâna „n” de după ce a fost descoperită actualizarea. De exemplu, dacă se descoperă astăzi o actualizare, prima valoare din listă definește procentul de dispozitive din UO care trebuie să treacă la versiunea respectivă în următoarea săptămână. A doua valoare definește procentul de dispozitive din UO care trebuie să treacă la versiunea respectivă în următoarele două săptămâni și așa mai departe.
-
-      Dacă există o valoare definită pentru această politică, actualizările vor ignora politica <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> și o vor urma pe aceasta.
-
-      Dacă lista este goală, nu va exista nicio simulare și actualizările vor fi aplicate conform altor politici privind dispozitivele.
-
-      Această politică nu se aplică pentru comutările de canal.</translation>
 <translation id="7295019613773647480">Activați utilizatorii monitorizați</translation>
 <translation id="7301543427086558500">Specifică o listă de adrese URL alternative care pot fi utilizate pentru a extrage termenii de căutare din motorul de căutare. Adresele URL trebuie să conțină șirul <ph name="SEARCH_TERM_MARKER" />, care va fi folosit pentru a extrage termenii de căutare.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 799deb3..96b8249 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1108,6 +1108,15 @@
 <translation id="4224610387358583899">Период неактивности для блокировки экрана</translation>
 <translation id="423797045246308574">Позволяет задать список шаблонов URL для сайтов, которым запрещено создавать ключи. При этом, если указанный шаблон подпадает под действие правила KeygenAllowedForUrls, сайту будет разрешено создавать ключи. Если правило KeygenBlockedForUrls не настроено, для всех сайтов используется значение по умолчанию на основе правила DefaultKeygenSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).</translation>
 <translation id="4239720644496144453">Кеш для приложений Android не используется. Если несколько пользователей устанавливают одно и то же приложение Android, для каждого из них оно скачивается заново.</translation>
+<translation id="4243336580717651045">Включает анонимный сбор данных с помощью URL в сервисе "<ph name="PRODUCT_NAME" />" и запрещает пользователям менять этот параметр.
+
+      Анонимный сбор данных с помощью URL используется, чтобы передавать в Google URL страниц, которые посещает пользователь, чтобы улучшить просмотр страниц и поиск.
+
+      Если вы включите это правило, анонимный сбор данных с помощью URL будет осуществляться постоянно.
+
+      Если вы включите это правило, анонимный сбор данных с помощью URL осуществляться не будет.
+
+      Если это правило не настроено, анонимный сбор данных с помощью URL будет осуществляться, но пользователи смогут изменять его.</translation>
 <translation id="4250680216510889253">Нет</translation>
 <translation id="4261820385751181068">Региональные настройки экрана входа</translation>
 <translation id="427220754384423013">Определяет принтеры, с которыми может работать пользователь.
@@ -1735,6 +1744,7 @@
           Данное правило следует применять, только если экран нужно блокировать задолго до того, как включается спящий режим, или если этот режим не используется. В остальных случаях рекомендуется настроить блокировку экрана при переходе в спящий режим и задать период неактивности в <ph name="PRODUCT_OS_NAME" /> для включения спящего режима.
 
           Значения задаются в миллисекундах и должны быть меньше периода неактивности, установленного для перехода в спящий режим.</translation>
+<translation id="6097601282776163274">Включить анонимный сбор данных с помощью URL</translation>
 <translation id="6111936128861357925">Разрешает игру с динозавром</translation>
 <translation id="6114416803310251055">устарело</translation>
 <translation id="6133088669883929098">Разрешить всем сайтам создавать ключи</translation>
@@ -2141,15 +2151,6 @@
 
           Если данный параметр отключен, эта функция недоступна.</translation>
 <translation id="7275334191706090484">Управляемые закладки</translation>
-<translation id="729492886167634859">Правило позволяет задать список процентных величин, определяющий долю устройств <ph name="PRODUCT_OS_NAME" /> в организации, которые будут обновляться еженедельно после обнаружения обновления. Обнаружение обновлений происходит после их публикации, поэтому между появлением обновлений и проверкой их наличия может пройти время.
-
-      N-ное значение в списке используется для определения количества устройств, которые должны быть обновлены в течение N-ной недели после обнаружения обновления. Например, если обновление обнаружено сегодня, первое значение списка определяет долю устройств в организации, которые должны обновиться в течение недели с сегодняшнего дня. Второе значение – долю устройств, которые должны обновиться в течение 2 недель и т. д.
-
-      Если для этого правила задано значение, обновления будут выполняться в соответствии с этим правилом независимо от значения правила <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />.
-
-      Если в списке нет ни одного значения, обновления будут применяться в соответствии остальными правилами, действующими на устройстве.
-
-      Это правило не применяется к переключению каналов.</translation>
 <translation id="7295019613773647480">Включить контролируемые профили</translation>
 <translation id="7301543427086558500">Задает список альтернативных URL, которые могут использоваться для извлечения запросов из поисковой системы. Для выполнения этой функции URL должен содержать строку <ph name="SEARCH_TERM_MARKER" />.
 
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 529ae96..f1fca9fc 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -289,6 +289,11 @@
       Ak niektoré nastavenie nebude určené, použije sa predvolená hodnota.
 
       Ak toto pravidlo nie je nastavené, použijú sa predvolené hodnoty pre všetky nastavenia.</translation>
+<translation id="1958138414749279167">Povolí v prehliadači <ph name="PRODUCT_NAME" /> funkciu Automatické dopĺňanie, ktorá používateľom umožňuje automaticky dopĺňať informácie o adrese do webových formulárov na základe predtým uložených informácií.
+
+      Ak toto nastavenie deaktivujete, Automatické dopĺňanie nebude nikdy navrhovať ani vyplňovať informácie o adrese ani ukladať informácie o ďalších adresách, ktoré môže používateľ odoslať počas prehliadania webu.
+
+      Ak ho povolíte alebo preň nenastavíte žiadnu hodnotu, používateľ bude môcť ovládať funkciu Automatické dopĺňanie pre adresy v používateľskom rozhraní.</translation>
 <translation id="1960840544413786116">Či sú povolené certifikáty vydané miestnymi dôveryhodnými autoritami, v ktorých chýba rozšírenie subjectAlternativeName</translation>
 <translation id="1964634611280150550">Režim inkognito je zakázaný</translation>
 <translation id="1964802606569741174">Toto pravidlo nemá žiaden vplyv na aplikáciu YouTube pre Android. Ak chcete v službe YouTube vynútiť Bezpečnostný režim, inštalácia aplikácie YouTube pre Android by mala byť zakázaná.</translation>
@@ -1898,6 +1903,7 @@
 <translation id="6440051664870270040">Povoliť webom súbežne prechádzať a otvárať kontextové okná</translation>
 <translation id="6447948611083700881">Zálohovanie a obnovenie je zakázané</translation>
 <translation id="645425387487868471">Povoliť vynútenie prihlásenia v prehliadači <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Povoliť Automatické dopĺňanie adries</translation>
 <translation id="6473623140202114570">Umožňuje nastaviť zoznam domén, na ktorých Bezpečné prehliadanie neaktivuje upozornenia.</translation>
 <translation id="6491139795995924304">Povoliť Bluetooth na zariadení</translation>
 <translation id="6520802717075138474">Importovať vyhľadávače z predvoleného prehliadača pri prvom spustení</translation>
@@ -2254,15 +2260,6 @@
 
           Ak je toto nastavenie zakázané, nebude táto funkcia k dispozícii.</translation>
 <translation id="7275334191706090484">Spravované záložky</translation>
-<translation id="729492886167634859">Toto pravidlo definuje zoznam percentuálnych hodnôt určujúcich časť zariadení so systémom <ph name="PRODUCT_OS_NAME" /> v organizačnej jednotke, ktorá má byť každý týždeň aktualizovaná odo dňa prvého zistenia dostupnosti aktualizácie. Čas zistenia nasleduje po čase zverejnenia aktualizácie, pretože zariadenie môže skontrolovať dostupnosť aktualizácií až s určitým časovým odstupom po ich zverejnení.
-
-      N-tá hodnota v zozname bude použitá ako percento zariadení, ktoré by malo dokončiť aktualizáciu na ďalšiu verziu v n-tom týždni po zistení dostupnosti aktualizácie. Ak sa napríklad zistí dostupnosť aktualizácie dnes, potom prvá hodnota v zozname definuje percento zariadení v organizačnej jednotke, ktoré by sa malo aktualizovať na túto verziu do jedného týždňa od dnešného dňa. Druhá hodnota definuje percento zariadení v organizačnej jednotke, ktoré by sa malo aktualizovať na túto verziu do dvoch týždňov od dnešného dňa atď.
-
-      Ak pre toto pravidlo nastavíte určitú hodnotu, aktualizácie budú ignorovať pravidlo <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> a budú sa namiesto toho riadiť týmto pravidlom.
-
-      Ak je tento zoznam prázdny, nebude dochádzať k zavádzaniu po etapách a aktualizácie sa budú zavádzať podľa iných pravidiel zariadenia.
-
-      Toto pravidlo sa netýka zmien kanálov.</translation>
 <translation id="7295019613773647480">Povoliť kontrolovaných používateľov</translation>
 <translation id="7301543427086558500">Určuje zoznam alternatívnych webových adries, ktoré sa môžu použiť na extrahovanie hľadaných výrazov z vyhľadávačov. Webové adresy by mali obsahovať značku <ph name="SEARCH_TERM_MARKER" />, ktorá sa použije na extrahovanie hľadaných výrazov.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index 4d05135..d0e693f 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -2286,15 +2286,6 @@
 
           Če je ta nastavitev onemogočena, ta funkcija ne bo na voljo.</translation>
 <translation id="7275334191706090484">Upravljani zaznamki</translation>
-<translation id="729492886167634859">Ta pravilnik opredeljuje seznam odstotkov, ki določajo delež naprav s sistemom <ph name="PRODUCT_OS_NAME" /> v organizacijski enoti, ki prejmejo posodobitev tedensko od dneva, ko je posodobitev prvič odkrita. Čas odkrivanja je poznejši od časa objave posodobitve, saj lahko po objavi posodobitve preteče nekaj časa, preden naprava preveri, ali je na voljo posodobitev.
-
-      N-ta vrednost na seznamu bo uporabljena kot odstotek naprav, ki morajo opraviti posodobitev na naslednjo različico v n-tem tednu po odkritju posodobitve. Če je na primer posodobitev odkrita danes, prva vrednost na seznamu določa odstotek naprav v organizacijski enoti, ki morajo posodobiti na dano posodobitev v enem tednu od današnjega dneva. Druga vrednost določa odstotek naprav v organizacijski enoti, ki morajo posodobiti na dano posodobitev v 2 tednih od današnjega dneva in tako naprej.
-
-      Če je za ta pravilnik določena vrednost, posodobitve prezrejo pravilnik <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> in upoštevajo ta pravilnik.
-
-      Če je seznam prazen, ni priprav in posodobitve bodo uveljavljene glede na druge pravilnike naprave.
-
-      Ta pravilnik se ne uporablja pri preklapljanju med kanali.</translation>
 <translation id="7295019613773647480">Omogoči zaščitene uporabnike</translation>
 <translation id="7301543427086558500">Določa seznam nadomestnih URL-jev, ki jih je mogoče uporabiti za pridobivanje iskalnih izrazov iz iskalnika. URL-ji morajo vsebovati niz <ph name="SEARCH_TERM_MARKER" />, ki bo uporabljen za pridobivanje iskalnih izrazov.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index f27d7b2..1cae5ca 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -2265,15 +2265,6 @@
 
           Ако је ово подешавање онемогућено, ова функција неће бити доступна.</translation>
 <translation id="7275334191706090484">Обележивачи којим се управља</translation>
-<translation id="729492886167634859">Ове смернице дефинишу листу процената којим ће се дефинисати удео <ph name="PRODUCT_OS_NAME" /> уређаја у ОЈ за недељно ажурирање, почев од дана када је ажурирање први пут откривено. Време откривања је касније од времена објављивања ажурирања јер после објављивања ажурирања може да прође одређено време док уређај не провери да ли постоје ажурирања.
-
-      n-та вредност на листи ће се користити као проценат уређаја који треба да доврше ажурирање на следећу верзију у n-тој недељи од откривања ажурирања. На пример, ако је ажурирање откривено данас, онда прва вредност на листи дефинише проценат уређаја у ОЈ који треба да се ажурирају на ту верзију у року од једне недеље од данас. Друга вредност дефинише проценат уређаја у ОЈ који треба да се ажурирају на ту верзију у року од две недеље од данас и тако даље.
-
-      Ако ове смернице дефинишу вредност, ажурирања ће занемарити смернице <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> и примениће ове смернице уместо тих.
-
-      Ако је ова листа празна, неће бити постепеног представљања и ажурирања ће се примењивати у складу са другим смерницама за уређај.
-
-      Ове смернице се не примењују на пребацивање канала.</translation>
 <translation id="7295019613773647480">Омогући кориснике под надзором</translation>
 <translation id="7301543427086558500">Наводи листу алтернативних URL адреса које могу да се користе за издвајање термина за претрагу из претраживача. URL адресе треба да садрже низ <ph name="SEARCH_TERM_MARKER" />, који ће се користити за издвајање термина за претрагу.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index b4e0d97..50cef869 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -2282,15 +2282,6 @@
 
           Om inställningen inaktiveras kommer inte funktionen att vara tillgänglig.</translation>
 <translation id="7275334191706090484">Hanterade bokmärken</translation>
-<translation id="729492886167634859">Med den här principen definieras en lista med procentvärden som anger hur stor andel av organisationsenhetens <ph name="PRODUCT_OS_NAME" />-enheter som ska uppdateras per vecka från den dag då uppdateringen hittades. Tiden när uppdateringen hittas är senare än uppdateringens publiceringsdatum, eftersom det kan dröja ett tag efter publiceringen innan enheten söker efter uppdateringar.
-
-      Värde nummer n i listan anger procentandelen enheter som ska uppdateras till nästa version under vecka n efter att uppdateringen hittades. Om en uppdatering hittas i dag, till exempel, anger det första värdet i listan procentandelen enheter i organisationsenheten som ska uppdateras till den versionen inom en vecka från och med i dag. Det andra värdet anger procentandelen enheter i organisationsenheten som ska uppdateras till den versionen inom två veckor från i dag, och så vidare.
-
-      Om ett värde har definierats för principen ignoreras principen <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> för uppdateringar och den här principen gäller i stället.
-
-      Om listan är tom görs ingen lansering i etapper och uppdateringarna tillämpas utifrån andra enhetsprinciper.
-
-      Principen gäller inte för kanalbyten.</translation>
 <translation id="7295019613773647480">Aktivera kontrollerade användare</translation>
 <translation id="7301543427086558500">Anger en lista med alternativa webbadresser som kan användas för att extrahera sökord från sökmotorn. Webbadresserna ska innehålla strängen <ph name="SEARCH_TERM_MARKER" />, som används för att extrahera sökorden.
 
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index b625a4e..eae4518 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -2247,15 +2247,6 @@
 
           Mpangilio huu ukizimwa, basi kipengele hiki hakitapatikana.</translation>
 <translation id="7275334191706090484">Alamisho Zinazosimamiwa</translation>
-<translation id="729492886167634859">Sera hii hubaini orodha ya asilimia ambazo zitabaini sehemu ya vifaa vya <ph name="PRODUCT_OS_NAME" /> katika OU ili visasishwe kila wiki kuanzia siku ambayo sasisho linagunduliwa. Muda wa kugundua ni wa baadaye ikilinganishwa na muda ambao sasisho lilichapishwa, kwa kuwa huenda muda ukapita baada ya chapisho kuchapishwa hadi wakati kifaa kitakapokagua masasisho.
-
-      Thamani ya n katika orodha itatumika kama asilimia ya vifaa ambavyo vinapaswa kusasishwa katika toleo lijalo kwenye wiki ya n baada ya kugundua sasisho. Kwa mfano, iwapo sasisho limegunduliwa leo, inamaanisha kuwa thamani ya kwanza katika orodha itabainisha asilimia ya vifaa katika OU ambavyo vinapaswa kusasishwa kwenye toleo hilo ndani ya wiki moja kuanzia leo. Thamani ya pili inabainisha asilimia ya vifaa katika OU ambavyo vinapaswa kusasishwa kwenye toleo hilo ndani ya wiki 2 kuanzia leo, na kadhalika.
-
-      Iwapo kuna thamani iliyobainishwa katika sera hii, masasisho hayatazingatia sera ya <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> na yatafuata sera hii badala yake.
-
-      Iwapo orodha haina kitu, mchakato hautaanzishwa na masasisho yatatumika kulingana na sera za vifaa vingine.
-
-      Sera hii haitumiki katika swichi za vituo.</translation>
 <translation id="7295019613773647480">Washa watumiaji wanaosimamiwa</translation>
 <translation id="7301543427086558500">Hubainisha orodha ya URL mbadala zinazoweza kutumiwa ili kupata taminolijia za utafutaji kutoka kwenye mtambo wa kutafuta. URL zinafaa kuwa na maneno <ph name="SEARCH_TERM_MARKER" />, ambayo yatatumika kupata taminolojia za utafutaji.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index 0af4ac5..e9d2d31a 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -2190,15 +2190,6 @@
 
           இந்த அமைப்பு முடக்கப்பட்டிருந்தால், பிறகு இந்த அம்சம் கிடைக்காது.</translation>
 <translation id="7275334191706090484">நிர்வகிக்கப்படும் புக்மார்க்குகள்</translation>
-<translation id="729492886167634859">இந்தக் கொள்கை, OUவில் உள்ள <ph name="PRODUCT_OS_NAME" /> சாதனங்களின் ஒரு பகுதியை, புதுப்பிப்பு முதலில் கண்டறியப்பட்ட நாளிலிருந்து தொடங்கும் வாரத்திற்கு ஒருமுறை புதுப்பிப்பதை வரையறுப்பதற்கான சதவிகிதங்களின் பட்டியலை வரையறுக்கிறது. புதுப்பிப்பு கண்டறியப்படும் நேரமானது புதுப்பிப்பு வெளியிடப்பட்ட நேரத்தை விட பிந்தையதாக இருக்கும், ஏனெனில் சாதனம் புதுப்பிப்புகளைச் சரிபார்க்கும் நேரத்தை விட புதுப்பிப்பு வெளியிடப்பட்ட நேரம் பிந்தையதாக இருக்க வாய்ப்புள்ளது.
-
-      பட்டியலில் உள்ள nனாவது மதிப்பு, புதுப்பிப்பு கண்டறியப்பட்ட பிறகு n வாரத்தில் அடுத்த பதிப்பிற்குப் புதுப்பிக்கப்பட வேண்டிய சாதனங்களின் சதவிகிதமாகப் பயன்படுத்தப்படும். எடுத்துக்காட்டாக, இன்று ஒரு புதுப்பிப்பு கண்டறியப்பட்டால், பட்டியலின் முதல் மதிப்பானது, இன்றிலிருந்து தொடங்கும் வாரத்தில் அந்தப் பதிப்புப் புதுப்பிக்கப்பட வேண்டிய OUவில் உள்ள சாதனங்களின் சதவிகிதத்தை வரையறுக்கும். இரண்டாம் மதிப்பானது இன்றிலிருந்து 2 வாரங்களில் அந்தப் பதிப்பிற்குப் புதுப்பிக்கப்பட வேண்டிய OUவில் உள்ள சாதனங்களின் சதவிகிதத்தை வரையறுக்கும்; அதற்கடுத்த மதிப்புகள் முறையே அதற்கடுத்த பதிப்புப் புதுப்பிப்புக்கான சாதனங்களின் சதவிகிதங்களை வரையறுக்கும்.
-
-      இந்தக் கொள்கைக்கென ஒரு மதிப்பு அமைக்கப்பட்டிருந்தால், புதுப்பிப்புகள் <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> கொள்கையைப் புறக்கணித்து, பதிலாக இந்தக் கொள்கையை நடைமுறைப்படுத்தும்.
-
-      பட்டியல் காலியாக இருந்தால், பதிப்புகள் படிப்படியாகப் புதுப்பிக்கப்படாமல், பிற சாதனக் கொள்கைகளின்படி புதுப்பிக்கப்படும்.
-
-      இந்தக் கொள்கை சேனல் மாற்றங்களுக்குப் பொருந்தாது.</translation>
 <translation id="7295019613773647480">கண்காணிக்கப்படும் பயனர்களை இயக்கு</translation>
 <translation id="7301543427086558500">தேடல் என்ஜினிலிருந்து தேடல் வார்த்தைகளைப் பிரிக்க பயன்படுத்தும் மாற்று URLகளின் பட்டியலைக் குறிப்பிடும். URLகளில் தேடல் வார்த்தைகளைப் பிரிக்க பயன்படுத்தும் <ph name="SEARCH_TERM_MARKER" /> சரம் இருக்க வேண்டும்.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 8142d52..30a92622 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -282,11 +282,11 @@
       ఈ విధానాన్ని డొమైన్ పేరును సూచించే వాక్యానికి సెట్ చేస్తే, <ph name="PRODUCT_OS_NAME" /> వినియోగదారు సైన్ ఇన్ చేసే సమయంలో డొమైన్ పేరు పొడిగింపు పేర్కొనాల్సిన శ్రమ లేకుండా కేవలం వారి వినియోగదారు పేరు మాత్రమే టైప్ చేసే వీలు కల్పిస్తూ స్వీయపూర్తి ఎంపికను చూపుతుంది.  వినియోగదారు ఈ డొమైన్ పేరు పొడిగింపును భర్తీ చేయగలుగుతారు.</translation>
 <translation id="1864382791685519617"><ph name="PRODUCT_NAME" />లో నెట్‌వర్క్ సూచనను ప్రారంభించడంతో పాటు, ఆ సెట్టింగ్‌ను మార్చకుండా వినియోగదారులను నిరోధిస్తుంది.
 
-    ఇది వెబ్ పేజీల యొక్క DNS పూర్వ ప్రాప్యతను అలాగే TCP మరియు SSL పూర్వ కనెక్షన్ మరియు పూర్వ అమలును కూడా నియంత్రిస్తుంది.
+    ఇది వెబ్ పేజీల యొక్క DNS ప్రి-ఫెచింగ్‌తో పాటు TCP మరియు SSL పూర్వ కనెక్షన్ మరియు పూర్వ అమలును కూడా నియంత్రిస్తుంది.
 
       ఒకవేళ మీరు ఈ విధానాన్ని సెట్ చేస్తే మాత్రం, వినియోగదారులు <ph name="PRODUCT_NAME" />లో ఈ సెట్టింగ్‌ను మార్చడం లేదా భర్తీ చేయడం చేయలేరు.
 
-      ఒకవేళ ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే, నెట్‌వర్క్ భావిసూచన ప్రారంభించబడుతుంది కానీ యూజర్ దాన్ని మార్చగలరు.</translation>
+      ఒకవేళ ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే, నెట్‌వర్క్ భావిసూచన ప్రారంభించబడుతుంది కానీ వినియోగదారు దాన్ని మార్చగలరు.</translation>
 <translation id="1865417998205858223">కీలక అనుమతులు</translation>
 <translation id="186719019195685253">AC శక్తిపై అమలవుతున్న సమయంలో నిష్క్రియ ఆలస్యాన్ని చేరుకున్నప్పుడు తీసుకోవలసిన చర్య</translation>
 <translation id="187819629719252111">ఫైల్ ఎంపిక డైలాగ్‌లను ప్రదర్శించడానికి <ph name="PRODUCT_NAME" />ను అనుమతించడం ద్వారా మెషీన్‌లోని స్థానిక ఫైల్‌లకు ప్రాప్యతను అనుమతిస్తుంది. మీరు ఈ సెట్టింగ్‌ని ప్రారంభిస్తే, వినియోగదారులు ఫైల్ ఎంపిక డైలాగ్‌లను సాధారణంగా తెరవగలరు. మీరు ఈ సెట్టింగ్‌ని ఆపివేస్తే, వినియోగదారు పైల్ ఎంపిక డైలాగ్‌ను (బుక్‌మార్క్‌లను దిగుమతి చేయడం, ఫైల్‌లను అప్‌లోడ్ చేయడం, లింక్‌లను సేవ్ చేయడం, మొదలైనవి) చూపే ఒక చర్యను చేసినప్పుడు, బదులుగా ఒక సందేశం ప్రదర్శించబడుతుంది మరియు వినియోగదారు ఫైల్ ఎంపిక డైలాగ్‌లో రద్దు చేయి క్లిక్ చేసి ఉంటారని భావిస్తారు. ఈ సెట్టింగ్‌ను సెట్ చేయకపోతే, వినియోగదారులు ఫైల్ ఎంపిక డైలాగ్‌లను సాధారణంగా తెరవగలరు.</translation>
@@ -1495,11 +1495,11 @@
       ఈ సూచనలు Google సర్వర్‌ల నుండి రిమోట్‌గా అందించబడతాయి.
 
       ఈ సెట్టింగ్ తప్పుకి సెట్ చేయబడినట్లయితే, సూచనలు అందించబడవు లేదా ప్రదర్శించబడవు.</translation>
-<translation id="4788252609789586009"><ph name="PRODUCT_NAME" />లో ఆటోఫిల్‌ ఫీచర్‌ని ప్రారంభించడంతో పాటు ఇంతకముందు స్టోర్ చేసిన సమాచారాన్ని ఉపయోగించి వెబ్ ఫారమ్‌లలో క్రెడిట్ కార్డ్ సమాచారాన్ని ఆటోమేటిక్‌గా పూర్తి చేయడానికి వినియోగదారులను అనుమతిస్తుంది.
+<translation id="4788252609789586009"><ph name="PRODUCT_NAME" />లో ఆటోఫిల్‌ ఫీచర్‌ని ప్రారంభించడంతో పాటు ఇంతకముందు నిల్వ చేసిన సమాచారాన్ని ఉపయోగించి వెబ్ ఫారమ్‌లలో క్రెడిట్ కార్డ్ సమాచారాన్ని ఆటోమేటిక్‌గా పూర్తి చేయడానికి వినియోగదారులను అనుమతిస్తుంది.
 
-      ఒకవేళ ఈ సెట్టింగ్‌ని నిలిపివేస్తే, ఆటోఫిల్‌ ఇంకెప్పుడూ వివరాలను సూచించడం లేదా క్రెడిట్ కార్డ్ సమాచారాన్ని పూరించడం గానీ చేయదు, ఇంకా వెబ్‌ని బ్రౌజ్ చేసే సమయంలో యూజర్ సమర్పించే అదనపు క్రెడిట్ కార్డ్ సమాచారాన్ని కూడా సేవ్ చేయదు.
+      ఒకవేళ ఈ సెట్టింగ్‌ని నిలిపివేస్తే, ఆటోఫిల్‌ ఇంకెప్పుడూ వివరాలను సూచించడం లేదా క్రెడిట్ కార్డ్ సమాచారాన్ని పూరించడం గానీ చేయదు, ఇంకా వెబ్‌ని బ్రౌజ్ చేసే సమయంలో వినియోగదారు సమర్పించే అదనపు క్రెడిట్ కార్డ్ సమాచారాన్ని కూడా సేవ్ చేయదు.
 
-      ఒకవేళ ఈ సెట్టింగ్‌ని ప్రారంభించినట్లయితే లేదా విలువను సెట్ చేయకుంటే, UIలో క్రెడిట్ కార్డ్‌ల ఆటోఫిల్‌ ఫీచర్‌ని యూజర్ నియంత్రించగలరు.</translation>
+      ఒకవేళ ఈ సెట్టింగ్‌ని ప్రారంభించినట్లయితే లేదా విలువను సెట్ చేయకుంటే, UIలో క్రెడిట్ కార్డ్‌ల ఆటోఫిల్‌ ఫీచర్‌ని వినియోగదారు నియంత్రించగలుగుతారు.</translation>
 <translation id="4791031774429044540">పెద్ద కర్సర్ ప్రాప్యత లక్షణాన్ని ప్రారంభించండి.
 
           ఈ విధానాన్ని ఒప్పుకు సెట్ చేస్తే, పెద్ద కర్సర్ ఎల్లప్పుడూ ప్రారంభించబడుతుంది.
@@ -1632,9 +1632,9 @@
       ఈ విధానాన్ని సెట్ చేయకపోతే లేదా తప్పుకి సెట్ చేసి ఉంటే, పరికరంలో డెవలపర్ మోడ్ అలాగే అందుబాటులో ఉంటుంది.</translation>
 <translation id="520403427390290017">ట్యాబ్ లైఫ్‌సైకిల్‌ల ఫీచర్ ద్వారా CPU మెమరీని అలాగే దానితో పాటుగా ఎక్కువ సేపటి నుంచి రన్ అవుతూ, నిరుపయోగంగా ఉన్న ట్యాబ్‌లలో దాగి ఉన్న మెమోరీని, విడుదల చేయడానికి ట్యాబ్‌లను ముందుగా కుదింపు చేసి, అక్కడికక్కడే స్తంభింపజేస్తుంది ఆపై వాటిని తొలగిస్తుంది.
 
-      ఒకవేళ ఈ విధానాన్ని తప్పుకి సెట్ చేయబడినట్లయితే ట్యాబ్ లైఫ్‌సైకిల్‌ల ఫీచర్ నిలిపివేయబడుతుంది, అలాంటప్పుడు ట్యాబ్‌లన్నీ మాములుగానే అమలు అవుతూ ఉంటాయి. 
+      ఒకవేళ ఈ విధానాన్ని తప్పుకి సెట్ చేసినట్లయితే ట్యాబ్ లైఫ్‌సైకిల్‌ల ఫీచర్ నిలిపివేయబడుతుంది, అలాంటప్పుడు ట్యాబ్‌లన్నీ మాములుగానే అమలు అవుతూ ఉంటాయి. 
        
-      ఒకవేళ ఈ విధానాన్ని ఒప్పుకి సెట్ చేయబడినా లేదా ఫలానా అని పెర్కొనకపోయినా ట్యాబ్ లైఫ్‌సైకిల్స్ ఫీచర్ ప్రారంభించబడుతుంది.</translation>
+      ఒకవేళ ఈ విధానాన్ని ఒప్పుకి సెట్ చేసినా లేదా ఫలానా అని పేర్కొనకపోయినా ట్యాబ్ లైఫ్‌సైకిల్‌ల ఫీచర్ ప్రారంభించబడుతుంది.</translation>
 <translation id="5208240613060747912">ప్రకటనలను ప్రదర్శించడానికి అనుమతించబడని సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానం సెట్ చేయకుండా వదిలి పెట్టినది అయితే అన్ని సైట్‌లకు సార్వజనీన డిఫాల్ట్ విలువ ఇది సెట్ చేయబడి ఉంటే 'DefaultNotificationsSetting' విధానం నుండి లేదా చేయబడకపోతే వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి ఉపయోగించబడుతుంది.</translation>
 <translation id="5219844027738217407">Android అనువర్తనాల కోసం, ఈ విధానం మైక్రోఫోన్‌పై మాత్రమే ప్రభావం చూపుతుంది. ఈ విధానాన్ని ఒప్పుకి సెట్ చేసినప్పుడు, మినహాయింపులు లేకుండా అన్ని Android అనువర్తనాల కోసం మైక్రోఫోన్ మ్యూట్ చేయబడుతుంది.</translation>
 <translation id="523505283826916779">ప్రాప్యత సెట్టింగ్‌లు</translation>
@@ -2454,15 +2454,6 @@
 మీరు ఈ సెట్టింగ్‌ను నిలిపివేస్తే, వినియోగదారులు Smart Lock ఉపయోగించడానికి అనుమతించబడరు.
 
 ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, డిఫాల్ట్ అనేది ఎంటర్‌ప్రైజ్ నిర్వహిత వినియోగదారులకు అనుమతించబడదు, కానీ నిర్వహించబడని వినియోగదారులకు అనుమతించబడుతుంది.</translation>
-<translation id="729492886167634859">ఈ విధానం ప్రకారం కొత్త అప్‌డేట్ వచ్చిన రోజు నుంచి వారానికి, ఎన్ని <ph name="PRODUCT_OS_NAME" /> పరికరాలలో OU అప్‌డేట్ చేయబడింది అనేటువంటి, ఆయా గణాంకాలను శాతాల, నిష్పత్తుల రూపంలో సూచిస్తుంది. నిజానికి కొత్త అప్‌డేట్‌ అందుబాటులోకి వచ్చిన సమయానికి దాన్ని మీ పరికరంలో అప్‌డేట్‌ చేసే సమయానికి వ్యత్యాసం ఉంటుంది, ఎందుకంటే మీ పరికరం కొత్త అప్‌డేట్‌ల కోసం తనిఖీ చేసేంత వరకు కొత్తగా అందుబాటులోకి వచ్చిన అప్‌డేట్‌లను కనుగొనలేదు.
-
-      జాబితాలోని n- వ విలువ కొత్త అప్‌డేట్ వచ్చిన రోజు నుంచి n-వ వారంలోగా ఇన్ని పరికరాలలో కొత్త వెర్షన్‌ని అప్‌డేట్‌ చేయబడింది అనేటువంటి, ఆయా గణాంకాలను శాతాల, నిష్పత్తుల రూపంలో సూచిస్తుంది. ఉదాహరణకు, ఒక కొత్త అప్‌డేట్‌ని ఈరోజే కనుగొంటే, జాబితాలోని మొదటి విలువ ఈ కొత్త వెర్షన్‌ని నేటి నుంచి ఈ వారం చివరి వరకు అప్‌డేట్‌ చేయబడే  OU లోని పరికరాల శాతాన్ని సూచిస్తుంది. రెండవ విలువ ఈ కొత్త వెర్షన్‌ని నేటి నుంచి వచ్చే 2 వారాలలోగా అప్‌డేట్‌ చేయబడే  OU లోని పరికరాల శాతాన్ని సూచిస్తుంది, మరియు ఈ విధంగా ఉంటుంది.
-
-      ఈ విధానం కోసం సూచించబడిన విలువ ఇంకేదైనా ఉంటే, అప్‌డేట్‌లు <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> విధానాన్ని విస్మరించి అందుకు బదులుగా ఈ విధానాన్ని అనుసరిస్తాయి.
-
-      ఈ జాబితా ఖాళీగా ఉంటే, ఇతర పరికరాల విధానాలకు అనుగుణంగా స్టేజింగ్ ఉండదు మరియు అప్‌డేట్‌లు వర్తించబడతాయి.
-
-      ఈ విధానం ఛానెల్ స్విచ్‌లకు వర్తించదు.</translation>
 <translation id="7295019613773647480">పర్యవేక్షించబడే వినియోగదారులను ప్రారంభించు</translation>
 <translation id="7301543427086558500">శోధన ఇంజిన్ నుండి శోధన పదాలను సంగ్రహించడానికి ఉపయోగించబడే ప్రత్యామ్నాయ URLల జాబితాను నిర్దేశిస్తుంది. URLలు శోధన పదాలను సంగ్రహించడానికి ఉపయోగించబడే స్ట్రింగ్ <ph name="SEARCH_TERM_MARKER" />ను కలిగి ఉండాలి.
 
@@ -2987,7 +2978,7 @@
       <ph name="PRODUCT_NAME" />కోసం ఈ పాస్‌వర్డ్‌ని మార్చు పేజీలో కొత్త పాస్‌వర్డ్ వేలిముద్రను సరిగ్గా క్యాప్చర్ చేయడానికి, మీ పాస్‌వర్డ్‌ని మార్చు పేజీ, https://www.chromium.org/developers/design-documents/create-amazing-password-formsలోని మార్గదర్శకాలను అనుసరిస్తుందని దయచేసి నిర్ధారించుకోండి.
 
       ఈ సెట్టింగ్‌ ప్రారంభించబడినట్లయితే, బ్రౌజర్‌లో ఏదైనా ప్రమాదకర హెచ్చరిక కనిపిస్తే, పాస్‌వర్డ్ రక్షణ సేవ వారిని ఈ URLకు పంపుతుంది, ఇక్కడ వారు తమ పాస్‌వర్డ్‌లను మార్చుకోవచ్చు.
-      ఈ సెట్టింగ్‌ నిలిపివేబడినట్లయితే లేదా సెట్ చేయబడకపోయినట్లయితే, అప్పుడు పాస్‌వర్డ్ రక్షణ సేవ, వినియోగదారులను వారి పాస్‌వర్డ్‌లు మార్చుకోవడానికి https://myaccounts.google.comకి పంపుతుంది.
+      ఈ సెట్టింగ్‌ నిలిపివేయబడినట్లయితే లేదా సెట్ చేయబడకపోయినట్లయితే, అప్పుడు పాస్‌వర్డ్ రక్షణ సేవ, వినియోగదారులను వారి పాస్‌వర్డ్‌లు మార్చుకోవడానికి https://myaccounts.google.comకి పంపుతుంది.
       ఈ విధానం <ph name="MS_AD_NAME" /> డొమైన్‌లో చేరని Windowsని ఉపయోగించే సందర్భాలలో అందుబాటులో ఉండదు.</translation>
 <translation id="8499172469244085141">డిఫాల్ట్ సెట్టింగ్‌లు (వినియోగదారులు భర్తీ చేయవచ్చు)</translation>
 <translation id="8507835864888987300">స్వయంచాలక అప్‌డేట్‌ల కోసం లక్ష్య వెర్షన్‌ను సెట్ చేస్తుంది.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 08eb664a..474942a 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -2166,15 +2166,6 @@
 
           หากการตั้งค่านี้ถูกปิดใช้งาน ฟีเจอร์นี้จะไม่สามารถใช้ได้</translation>
 <translation id="7275334191706090484">บุ๊กมาร์กที่มีการจัดการ</translation>
-<translation id="729492886167634859">นโยบายนี้จะกำหนดรายการเปอร์เซ็นต์ที่จะแบ่งส่วนของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ใน OU ที่จะอัปเดตต่อสัปดาห์ เริ่มจากวันที่พบอัปเดตเป็นครั้งแรก เวลาค้นพบจะมาทีหลังเวลาเผยแพร่การอัปเดตเพราะอาจใช้เวลาสักพัก นับตั้งแต่ระยะเวลาเผยแพร่การอัปเดตจนถึงเวลาที่อุปกรณ์ตรวจหาอัปเดต
-
-      ค่าลำดับที่ (n-th) ในรายการจะใช้เป็นเปอร์เซ็นต์ของอุปกรณ์ที่ควรอัปเดตเป็นเวอร์ชันถัดไปในสัปดาห์ที่เท่านั้นหลังจากพบการอัปเดตแล้ว เช่น หากค้นพบการอัปเดตวันนี้ ค่าแรกในรายการจะกำหนดเปอร์เซ็นต์ของอุปกรณ์ใน OU ที่ควรอัปเดตเป็นเวอร์ชันนั้นภายใน 1 สัปดาห์จากวันนี้ ค่าที่ 2 จะกำหนดเปอร์เซ็นต์ของอุปกรณ์ใน OU ที่ควรอัปเดตเป็นเวอร์ชันนั้นภายใน 2 สัปดาห์นับจากวันนี้ และเป็นแบบนี้ไปเรื่อยๆ
-
-      หากมีการกำหนดค่าไว้ในนโยบายนี้ อัปเดตจะไม่สนใจนโยบาย <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> และทำตามนโยบายนี้แทน
-
-      หากรายการนี้ว่างเปล่า จะไม่มีการกำหนดแบบทีละขั้นและระบบจะนำการอัปเดตไปใช้ตามนโยบายอื่นๆ ของอุปกรณ์
-
-      นโยบายนี้ไม่มีผลกับการเปลี่ยนช่อง</translation>
 <translation id="7295019613773647480">เปิดใช้งานผู้ใช้ภายใต้การดูแล</translation>
 <translation id="7301543427086558500">ระบุรายการ URL สำรองที่สามารถใช้ในการดึงข้อความค้นหาจากเครื่องมือค้นหา URL ควรมีสตริง <ph name="SEARCH_TERM_MARKER" /> ซึ่งจะใช้ในการดึงข้อความค้นหา
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 1fe53e70..bd08eb56 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -2261,15 +2261,6 @@
 
           Bu ayar devre dışı bırakılırsa, bu özellik kullanılamaz.</translation>
 <translation id="7275334191706090484">Yönetilen Yer İşaretleri</translation>
-<translation id="729492886167634859">Bu politika, güncellemenin ilk keşfedildiği günden başlayarak kuruluş biriminde her hafta güncellenecek <ph name="PRODUCT_OS_NAME" /> cihazlarının oranını belirleyen bir yüzde listesi tanımlar. Güncellenmenin yayınlanmasıyla cihazın güncellemeleri kontrol etmesi arasında bir süre geçebileceğinden keşif zamanı, güncellemenin yayınlanma zamanından sonra olur.
-
-      Listedeki n. değer, güncellemenin keşfedilmesinden sonraki n. haftada yeni sürüme geçişlerinin tamamlanması gereken cihaz yüzdesi olarak kullanılır. Örneğin, bugün bir güncelleme keşfedilirse listedeki ilk değer, bugünden itibaren bir hafta içinde söz konusu sürüme güncellenmesi gereken kuruluş birimindeki cihaz yüzdesini tanımlar. İkinci değer, bugünden itibaren 2 hafta içinde söz konusu sürüme güncellenmesi gereken kuruluş birimindeki cihaz yüzdesini tanımlar ve listedeki değerler bu şekilde devam eder.
-
-      Bu politika için tanımlanmış bir değer varsa güncellemeler <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> politikasını yoksayar ve onun yerine bu politikayı uygular.
-
-      Bu liste boşsa hazırlık yapılmaz ve güncellemeler, diğer cihaz politikalarına göre uygulanır.
-
-      Bu politika, kanal geçişleri için uygulanmaz.</translation>
 <translation id="7295019613773647480">Denetlenen kullanıcıları etkinleştir</translation>
 <translation id="7301543427086558500">Arama motorundan arama terimlerini çıkartmak için kullanılabilecek alternatif URL'lerin bir listesini belirtir. URL'ler, arama terimlerinin çıkartılmasında kullanılacak <ph name="SEARCH_TERM_MARKER" /> dizesini içermelidir.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 438dc21d..cfb10515 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -295,6 +295,11 @@
       Якщо цей параметр не вказано, використовується значення за умовчанням.
 
       Якщо це правило не встановлено, для всіх параметрів використовуються значення за умовчанням.</translation>
+<translation id="1958138414749279167">Вмикає функцію автозаповнення в продукті <ph name="PRODUCT_NAME" /> і автоматично вводить адресу у веб-форми, використовуючи раніше збережену інформацію.
+
+      Якщо це налаштування вимкнено, функція автозаповнення не пропонуватиме та не вводитиме адресу, а також не зберігатиме додаткові дані про неї, які користувач може вказувати під час веб-перегляду.
+
+      Якщо це налаштування ввімкнено або значення не вибрано, користувачі зможуть керувати функцією автозаповнення адрес в інтерфейсі.</translation>
 <translation id="1960840544413786116">Чи дозволяти сертифікати, видані локальними ключами довіри, які не мають розширення subjectAlternativeName</translation>
 <translation id="1964634611280150550">Режим анонімного перегляду вимкнено</translation>
 <translation id="1964802606569741174">Це правило не впливає на додаток YouTube на пристрої Android. Щоб для YouTube використовувався Безпечний режим, забороніть встановлення додатка YouTube на пристрої Android.</translation>
@@ -1838,6 +1843,7 @@
 <translation id="6440051664870270040">Дозволити сайтам одночасно здійснювати навігацію та відкривати спливаючі вікна</translation>
 <translation id="6447948611083700881">Резервне копіювання та відновлення вимкнено</translation>
 <translation id="645425387487868471">Увімкнути примусовий вхід в обліковий запис у <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Увімкнути функцію автозаповнення адрес</translation>
 <translation id="6473623140202114570">Налаштувати список доменів, у яких Безпечний перегляд не показуватиме застережень.</translation>
 <translation id="6491139795995924304">Увімкнути Bluetooth на пристрої</translation>
 <translation id="6520802717075138474">Імпорт пошукових систем із веб-переглядача за умовчанням під час першого запуску</translation>
@@ -2171,14 +2177,6 @@
 
           Якщо цей параметр вимкнено, ця функція недоступна.</translation>
 <translation id="7275334191706090484">Закладки, якими керує адміністратор</translation>
-<translation id="729492886167634859">Це правило надає список із відсотковою часткою пристроїв <ph name="PRODUCT_OS_NAME" /> в організаційному підрозділі, які оновлюватимуться впродовж тижня, починаючи від дня, коли оновлення вперше виявлено. Час оновлення є пізнішім за час публікації, оскільки може пройти певний час, перш ніж пристрій перевірятиме наявність оновлень.
-      Значення n у списку означає відсоток пристроїв, які повинні оновитися до наступної версії впродовж n-го тижня після виявлення оновлення. Наприклад, якщо оновлення виявлено сьогодні, то перше значення в списку визначає відсоток пристроїв в організаційному підрозділі, які повинні встановити цю версію впродовж тижня. Друге значення вказує відсоткову частку пристроїв в організаційному підрозділі, які повинні оновитися до цієї версії впродовж 2 тижнів тощо.
-
-      Якщо для цього правила встановлено значення, оновлення ігноруватимуть правило <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> і натомість застосовуватимуть це правило.
-
-      Якщо список порожній, оновлення не буде поетапним і застосовуватиметься відповідно до правил пристрою.
-
-      Це правило не застосовується до змін каналів.</translation>
 <translation id="7295019613773647480">Увімкнути контрольованих користувачів</translation>
 <translation id="7301543427086558500">Визначає список альтернативних URL-адрес, за якими можна отримувати пошукові терміни з пошукової системи. URL-адреси мають містити рядок <ph name="SEARCH_TERM_MARKER" />, який використовується для отримання пошукових термінів.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index f45ab1d4..d21760d 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -2267,15 +2267,6 @@
 
           Nếu vô hiệu hóa cài đặt này thì tính năng này sẽ không khả dụng.</translation>
 <translation id="7275334191706090484">Dấu trang được quản lý</translation>
-<translation id="729492886167634859">Chính sách này xác định danh sách tỷ lệ phần trăm để xác định tỷ lệ thiết bị <ph name="PRODUCT_OS_NAME" /> trong đơn vị tổ chức sẽ cập nhật mỗi tuần, bắt đầu từ ngày phát hiện bản cập nhật lần đầu tiên. Thời điểm phát hiện muộn hơn thời điểm phát hành bản cập nhật vì sẽ mất một thời gian từ khi phát hành bản cập nhật đến khi thiết bị kiểm tra các bản cập nhật.
-
-      Giá trị thứ n trong danh sách này sẽ dùng làm tỷ lệ phần trăm thiết bị sẽ hoàn thành việc cập nhật lên phiên bản mới trong tuần thứ n sau khi phát hiện bản cập nhật. Ví dụ: Nếu phát hiện bản cập nhật hôm nay, thì giá trị đầu tiên trong danh sách sẽ xác định tỷ lệ phần trăm thiết bị trong đơn vị tổ chức sẽ cập nhật lên phiên bản mới đó sau 1 tuần kể từ hôm nay. Giá trị thứ hai sẽ xác định tỷ lệ phần trăm thiết bị trong đơn vị tổ chức sẽ cập nhật lên phiên bản mới đó sau 2 tuần kể từ hôm nay, v.v.
-
-      Nếu có một giá trị xác định cho chính sách này, thì các bản cập nhật sẽ bỏ qua chính sách <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> và tuân theo chính sách này.
-
-      Nếu danh sách này trống, thì sẽ không có quy trình theo giai đoạn nào và các bản cập nhật sẽ được áp dụng theo những chính sách thiết bị khác.
-
-      Chính sách này không áp dụng cho quá trình chuyển đổi giữa các kênh.</translation>
 <translation id="7295019613773647480">Bật người dùng được giám sát</translation>
 <translation id="7301543427086558500">Chỉ định danh sách các URL thay thế có thể được sử dụng để trích xuất cụm từ tìm kiếm từ công cụ tìm kiếm. URL phải chứa chuỗi <ph name="SEARCH_TERM_MARKER" />, sẽ được sử dụng để trích xuất cụm từ tìm kiếm.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index c76c4da7..43d14aa 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -2124,15 +2124,6 @@
 
           如果停用此设置,则无法使用该功能。</translation>
 <translation id="7275334191706090484">受管理的书签</translation>
-<translation id="729492886167634859">此政策可指定一个百分比列表,这些百分比用于界定组织单元中每周(从首次发现相应更新的那一天起算)要更新的那部分 <ph name="PRODUCT_OS_NAME" />设备。发现时间会晚于更新发布时间,这是因为设备可能要在更新发布一段时间之后才会检查是否有更新。
-
-      列表中的第 n 个值将用作应在发现相应更新后的第 n 周内更新到下一版本的设备所占的百分比。例如,如果某项更新是在今天发现的,那么列表中的第 1 个值将会界定组织单元中应在从今天起算的第 1 周内更新到该版本的设备所占的百分比。第 2 个值将会界定组织单元中应在从今天起算的第 2 周内更新到该版本的设备所占的百分比,以此类推。
-
-      如果为此政策指定了值,相应更新将会忽略 <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> 政策并改为遵守此政策。
-
-      如果此列表为空,系统将不会分阶段进行更新,而是会根据其他设备政策应用更新。
-
-      此政策不适用于版本切换。</translation>
 <translation id="7295019613773647480">启用受监管用户</translation>
 <translation id="7301543427086558500">指定可用于从搜索引擎提取搜索字词的备选网址列表。网址应当包含字符串“<ph name="SEARCH_TERM_MARKER" />”,以便提取搜索字词。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 684665cf..c266e16 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -2176,15 +2176,6 @@
 
           如果你停用這項設定,使用者就無法使用這項功能。</translation>
 <translation id="7275334191706090484">受管理書籤</translation>
-<translation id="729492886167634859">這項政策是用來定義一份百分比清單,藉此指定首次偵測到更新的當天算起的每一週內,機構單位中可安裝更新的 <ph name="PRODUCT_OS_NAME" />裝置百分比。偵測到更新的時間會晚於更新發佈時間,因為更新發佈後,裝置可能要經過一段時間才會檢查是否有更新。
-
-      清單中的第 n 值代表應在偵測到更新後第 n 週內更新至新版本的裝置百分比。舉例來說,如果系統在今天偵測到更新內容,則清單中的第一個值定義的是從今天算起 1 週內,機構單位中應安裝該版本的裝置百分比,第二個值定義的則是從今天算起 2 週內,機構單位中應安裝該版本的裝置百分比,以此類推。
-
-      如果為這項政策定義了任何值,更新會忽略 <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> 政策並改為遵循這項政策。
-
-      如果這份清單未包含任何內容,系統就不會分階段安裝更新,而會依其他裝置政策套用更新。
-
-      版本切換不適用這項政策。</translation>
 <translation id="7295019613773647480">啟用受監管的使用者</translation>
 <translation id="7301543427086558500">指定替代網址清單,以供系統從搜尋引擎擷取搜尋字詞。網址中必須包含「<ph name="SEARCH_TERM_MARKER" />」字串,才能擷取搜尋字詞。
 
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index ec94b86e7..614e7614 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -395,10 +395,9 @@
     const GURL& main_frame_url,
     ReusedPasswordType password_type,
     RequestOutcome* reason) {
-  *reason = RequestOutcome::URL_NOT_VALID_FOR_REPUTATION_COMPUTING;
+  *reason = RequestOutcome::UNKNOWN;
   if (IsPingingEnabled(trigger_type, reason) &&
-      !IsURLWhitelistedForPasswordEntry(main_frame_url, reason) &&
-      CanGetReputationOfURL(main_frame_url)) {
+      !IsURLWhitelistedForPasswordEntry(main_frame_url, reason)) {
     return true;
   }
   LogNoPingingReason(trigger_type, *reason, password_type,
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index a7bae10a..41c05a0 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">ገጹን ማንነት በማያሳውቅ አዲስ ትር ውስጥ ይክፈቱ</translation>
 <translation id="8241707690549784388">እየፈለጉት ያሉት ገጽ ያስገቡትን መረጃ ተጥቅሟል። ወደዛ ገጽ መመለስ ወስደውት የነበረውን ርምጃ እንዲደገም ሊያደርግ ይችላል። ለመቀጠል ይፈልጋሉ?</translation>
 <translation id="8241712895048303527">በዚህ ጣቢያ ላይ አግድ</translation>
+<translation id="8242426110754782860">ቀጥል</translation>
 <translation id="8249320324621329438">ለመጨረሻ ጊዜ የመጣው፦</translation>
 <translation id="8253091569723639551">የማስከፈያ አድራሻ ያስፈልጋል</translation>
 <translation id="825929999321470778">ሁሉንም የተቀመጡ የይለፍ ቃላትን አሳይ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index ac38a6e9..bf6d2736 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">يمكنك فتح الصفحة في علامة تبويب جديدة للتصفح المتخفي</translation>
 <translation id="8241707690549784388">استخدمت الصفحة التي تبحث عنها المعلومات التي أدخلتها وقد يؤدّي الرجوع إليها  إلى تكرار  جميع الإجراءات السابقة. هل تريد المتابعة؟</translation>
 <translation id="8241712895048303527">الحظر على هذا الموقع</translation>
+<translation id="8242426110754782860">متابعة</translation>
 <translation id="8249320324621329438">تاريخ آخر عملية جلب:</translation>
 <translation id="8253091569723639551">عنوان إرسال الفواتير مطلوب</translation>
 <translation id="825929999321470778">عرض جميع كلمات المرور المحفوظة</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index ec950a9c..527a5d4b 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Отворете страницата в нов раздел в режим „инкогнито“.</translation>
 <translation id="8241707690549784388">Страницата, която търсите, използва въведената от вас информация. Ако се върнете на тази страница, действията, които вече сте изпълнили, може да бъдат повторени. Искате ли да продължите?</translation>
 <translation id="8241712895048303527">Блокиране за този сайт</translation>
+<translation id="8242426110754782860">Продължаване</translation>
 <translation id="8249320324621329438">Последно извличане:</translation>
 <translation id="8253091569723639551">Адресът за фактуриране е задължителен</translation>
 <translation id="825929999321470778">Показване на всички запазени пароли</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index 40febe7cb..c642bb6f0 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">নতুন ছদ্মবেশী ট্যাবে একটি পৃষ্ঠা খুলুন</translation>
 <translation id="8241707690549784388">আপনি যে পৃষ্ঠাটি খুঁজছেন সেটি আপনার প্রবেশ করানো তথ্য ব্যবহার করছে৷ এই পৃষ্ঠাতে ফিরে এলে কোনো ক্রিয়া আবার করতে হতে পারে৷ আপনি কি অবিরত করতে চান?</translation>
 <translation id="8241712895048303527">এই সাইটে ব্লক করুন</translation>
+<translation id="8242426110754782860">এগিয়ে যান</translation>
 <translation id="8249320324621329438">সর্বশেষ প্রাপ্ত করেছে:</translation>
 <translation id="8253091569723639551">বিলিং ঠিকানা প্রয়োজন</translation>
 <translation id="825929999321470778">সেভ করা সমস্ত পাসওয়ার্ড দেখান</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index d732029..aa5e144 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Obre la pàgina en una pestanya d'incògnit nova</translation>
 <translation id="8241707690549784388">La pàgina que busques utilitzava informació que vas introduir. Tornar a aquesta pàgina podria provocar una repetició de qualsevol acció realitzada. Vols continuar?</translation>
 <translation id="8241712895048303527">Bloqueja en aquest lloc web</translation>
+<translation id="8242426110754782860">Continua</translation>
 <translation id="8249320324621329438">Última obtenció:</translation>
 <translation id="8253091569723639551">Cal indicar l'adreça de facturació</translation>
 <translation id="825929999321470778">Mostra totes les contrasenyes desades</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 6d9dab18..db27f84 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -995,6 +995,7 @@
 <translation id="8238581221633243064">Otevřete stránku na nové anonymní kartě</translation>
 <translation id="8241707690549784388">Stránka, kterou hledáte, používala vámi zadané informace. Návrat na tuto stránku by mohl způsobit, že akce, kterou jste provedli, bude opakována. Přejete si pokračovat?</translation>
 <translation id="8241712895048303527">Na tomto webu blokovat</translation>
+<translation id="8242426110754782860">Pokračovat</translation>
 <translation id="8249320324621329438">Naposledy načteno:</translation>
 <translation id="8253091569723639551">Fakturační adresa je povinná</translation>
 <translation id="825929999321470778">Zobrazit všechna uložená hesla</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 7719212..6837e3c 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Åbn siden på en ny inkognitofane</translation>
 <translation id="8241707690549784388">Siden, du søger, benyttede oplysninger, du har indtastet. Vender du tilbage til denne side kan det betyde, at enhver handling, du har foretaget, skal gentages. Vil du fortsætte?</translation>
 <translation id="8241712895048303527">Bloker på dette website</translation>
+<translation id="8242426110754782860">Fortsæt</translation>
 <translation id="8249320324621329438">Sidste hentet:</translation>
 <translation id="8253091569723639551">Faktureringsadresse skal angives</translation>
 <translation id="825929999321470778">Se alle gemte adgangskoder</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index cff9025..62de4a4 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">Seite in einem neuen Inkognito-Tab öffnen</translation>
 <translation id="8241707690549784388">Die gesuchte Seite hat die von Ihnen eingegebenen Informationen verwendet bzw. verarbeitet. Wenn Sie zu dieser Seite zurückgehen, wird möglicherweise eine bereits ausgeführte Aktion wiederholt. Möchten Sie fortfahren?</translation>
 <translation id="8241712895048303527">Auf dieser Website blockieren</translation>
+<translation id="8242426110754782860">Fortfahren</translation>
 <translation id="8249320324621329438">Letzter Abruf:</translation>
 <translation id="8253091569723639551">Rechnungsadresse ist erforderlich</translation>
 <translation id="825929999321470778">Alle gespeicherten Passwörter anzeigen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 01ceff3..29cb7a25 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -1001,6 +1001,7 @@
 <translation id="8238581221633243064">Ανοίξτε τη σελίδα σε μια νέα καρτέλα ανώνυμης περιήγησης</translation>
 <translation id="8241707690549784388">Στη σελίδα που αναζητάτε χρησιμοποποιήθηκαν πληροφορίες που καταχωρίσατε. Αν επιστρέψετε σε αυτή τη σελίδα ίσως επαναληφθούν ενέργειες που εκτελέσατε. Θέλετε να συνεχίσετε;</translation>
 <translation id="8241712895048303527">Αποκλεισμός σε αυτόν τον ιστότοπο</translation>
+<translation id="8242426110754782860">Συνέχεια</translation>
 <translation id="8249320324621329438">Τελευταία ανάκτηση:</translation>
 <translation id="8253091569723639551">Απαιτείται διεύθυνση χρέωσης</translation>
 <translation id="825929999321470778">Εμφάνιση όλων των αποθηκευμένων κωδικών πρόσβασης</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 5a996e39..42011fb 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Open page in a new Incognito tab</translation>
 <translation id="8241707690549784388">The page that you're looking for used information that you entered. Returning to that page might cause any action that you took to be repeated. Do you want to continue?</translation>
 <translation id="8241712895048303527">Block on this site</translation>
+<translation id="8242426110754782860">Proceed</translation>
 <translation id="8249320324621329438">Last fetched:</translation>
 <translation id="8253091569723639551">Billing address required</translation>
 <translation id="825929999321470778">Show All Saved Passwords</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 6827119..1656b61 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -1001,6 +1001,7 @@
 <translation id="8238581221633243064">Abre la página en una nueva pestaña de incógnito.</translation>
 <translation id="8241707690549784388">La página que buscas ha utilizado la información que has especificado. Volver a la página podría provocar la repetición de alguna acción. ¿Deseas continuar?</translation>
 <translation id="8241712895048303527">Bloquear en este sitio</translation>
+<translation id="8242426110754782860">Continuar</translation>
 <translation id="8249320324621329438">Se obtuvo por última vez:</translation>
 <translation id="8253091569723639551">Se requiere una dirección de facturación</translation>
 <translation id="825929999321470778">Mostrar todas las contraseñas guardadas</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 19b3e1bc..43dfaee 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Abre una página en una nueva pestaña de incógnito</translation>
 <translation id="8241707690549784388">La página que buscas ha utilizado la información que has especificado. Volver a la página podría provocar la repetición de alguna acción. ¿Quieres continuar?</translation>
 <translation id="8241712895048303527">Bloquear en este sitio web</translation>
+<translation id="8242426110754782860">Continuar</translation>
 <translation id="8249320324621329438">Última comprobación:</translation>
 <translation id="8253091569723639551">Se necesita una dirección de facturación</translation>
 <translation id="825929999321470778">Mostrar todas las contraseñas guardadas</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 450af04..69fd5783e 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Avage leht uuel inkognito vahekaardil</translation>
 <translation id="8241707690549784388">Teie poolt otsitav lehekülg kasutas teie sisestatud andmeid. Sellele leheküljele naasmine võib kaasa tuua kõikide sooritatud tegevuste kordamise. Soovite jätkata?</translation>
 <translation id="8241712895048303527">Blokeeri sellel saidil</translation>
+<translation id="8242426110754782860">Jätka</translation>
 <translation id="8249320324621329438">Viimati toodud:</translation>
 <translation id="8253091569723639551">Arveldusaadress on nõutav</translation>
 <translation id="825929999321470778">Kuva kõik salvestatud paroolid</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index fc2965a..419e78f 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -810,6 +810,7 @@
 <translation id="6897140037006041989">نماینده کاربر</translation>
 <translation id="6903319715792422884">‏با ارسال برخی <ph name="BEGIN_WHITEPAPER_LINK" />اطلاعات سیستم و محتوای صفحه<ph name="END_WHITEPAPER_LINK" /> به Google، به بهبود «مرور ایمن» کمک کنید. <ph name="PRIVACY_PAGE_LINK" /></translation>
 <translation id="6915804003454593391">کاربر:</translation>
+<translation id="6944692733090228304">گذرواژه‌تان را در سایتی وارد کردید که توسط <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> مدیریت نمی‌شود. برای محافظت از حسابتان، از گذرواژه‌تان در برنامه‌ها و سایت‌های دیگر استفاده نکنید.</translation>
 <translation id="6945221475159498467">انتخاب</translation>
 <translation id="6948701128805548767">برای دیدن روش‌های تحویل گرفتن و شرایط موردنیاز، یک نشانی انتخاب کنید</translation>
 <translation id="6949872517221025916">بازنشانی گذرواژه</translation>
@@ -999,6 +1000,7 @@
 <translation id="8238581221633243064">صفحه را در برگه «ناشناس» جدیدی باز کنید</translation>
 <translation id="8241707690549784388">صفحه‌ای که جستجو می‌کنید از اطلاعاتی استفاده می‌کند که شما وارد کرده‌اید. بازگشت به آن صفحه ممکن است باعث شود اقدامی را که قبلاً انجام دادید دوباره تکرار کنید. آیا می‌خواهید ادامه دهید؟</translation>
 <translation id="8241712895048303527">مسدود کردن در این سایت</translation>
+<translation id="8242426110754782860">ادامه دادن</translation>
 <translation id="8249320324621329438">آخرین واکشی شده:</translation>
 <translation id="8253091569723639551">نشانی صورت‌حساب لازم است</translation>
 <translation id="825929999321470778">نمایش همه گذرواژه‌های ذخیره‌شده</translation>
@@ -1034,6 +1036,7 @@
 <translation id="8498891568109133222">پاسخ <ph name="HOST_NAME" /> بیش از حد طول کشیده است.</translation>
 <translation id="8503559462189395349">‏گذرواژه‌های Chrome</translation>
 <translation id="8503813439785031346">نام کاربری</translation>
+<translation id="8508648098325802031">نماد جستجو</translation>
 <translation id="8543181531796978784">می‌توانید <ph name="BEGIN_ERROR_LINK" />یک مشکل شناسایی‌شده را گزارش کنید<ph name="END_ERROR_LINK" /> یا اگر از خطراتی که امنیت شما را تهدید می‌کنند مطلع شدید، <ph name="BEGIN_LINK" />از این سایت ناامن دیدن کنید<ph name="END_LINK" />.</translation>
 <translation id="8543556556237226809">سؤال دارید؟ با فردی که بر نمایه‌تان نظارت دارد تماس بگیرید.</translation>
 <translation id="8553075262323480129">ترجمه انجام نشد زیرا زبان صفحه تعیین نشد.</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 25265aa2..466734c 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -1001,6 +1001,7 @@
 <translation id="8238581221633243064">Avaa sivu uudessa incognito-välilehdessä.</translation>
 <translation id="8241707690549784388">Etsimäsi sivu käytti antamiasi tietoja. Sivulle palaaminen voi johtaa jokaisen tekemäsi toiminnon toistamiseen. Haluatko jatkaa?</translation>
 <translation id="8241712895048303527">Estä tällä sivustolla</translation>
+<translation id="8242426110754782860">Jatka</translation>
 <translation id="8249320324621329438">Viimeksi haettu:</translation>
 <translation id="8253091569723639551">Laskutusosoite tarvitaan</translation>
 <translation id="825929999321470778">Näytä kaikki tallennetut salasanat</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 63e9ed1..0973cf12 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Buksan ang page sa bagong Incognito tab</translation>
 <translation id="8241707690549784388">Ang pahina na hinahanap mo para sa paggamit ng impormasyon na ipinasok mo. Ang pagbalik sa pahinang iyon maaaring magsanhi ng anumang aksyon na akalo mo ay naulit. Nais mo bang ipagpatuloy?</translation>
 <translation id="8241712895048303527">I-block sa site na ito</translation>
+<translation id="8242426110754782860">Magpatuloy</translation>
 <translation id="8249320324621329438">Huling kinuha:</translation>
 <translation id="8253091569723639551">Kinakailangan ang billing address</translation>
 <translation id="825929999321470778">Ipakita ang Lahat ng Naka-save na Password</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 3dad3bbce..3e4c461 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">Ouvrir la page dans un nouvel onglet de navigation privée</translation>
 <translation id="8241707690549784388">La page que vous recherchez a utilisé des informations que vous avez envoyées. Si vous revenez sur cette page, chaque action précédemment effectuée sera répétée. Souhaitez-vous continuer ?</translation>
 <translation id="8241712895048303527">Bloquer sur ce site</translation>
+<translation id="8242426110754782860">Continuer</translation>
 <translation id="8249320324621329438">Dernière récupération :</translation>
 <translation id="8253091569723639551">Adresse de facturation obligatoire</translation>
 <translation id="825929999321470778">Afficher tous les mots de passe enregistrés</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index deafb3e..74c21cd 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">એક નવી છુપી વિંડોમાં પેજ ખોલો</translation>
 <translation id="8241707690549784388">તમારા દ્વારા દાખલ કરાયેલી વપરાયેલી માહિતી માટે આ પાનું તમે જોઈ રહ્યા છો. તે પૃષ્ઠ પર પાછા જવાથી એવી કોઈપણ ક્રિયા ફરીથી થઈ શકે છે જે તમે પહેલા કરી હતી. શું તમે ચાલુ રાખવા માંગો છો?</translation>
 <translation id="8241712895048303527">આ સાઇટ પર અવરોધિત કરો</translation>
+<translation id="8242426110754782860">આગળ વધો</translation>
 <translation id="8249320324621329438">છેલ્લું આનયન:</translation>
 <translation id="8253091569723639551">બિલિંગ સરનામું આવશ્યક</translation>
 <translation id="825929999321470778">બધા સાચવેલા પાસવર્ડ બતાવો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index afde5e1..2e883c0 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">पेज को नए गुप्त टैब में खोलें</translation>
 <translation id="8241707690549784388">आपके द्वारा खोजे जा रहे पेज ने आपके द्वारा प्रविष्ट की गई जानकारी का उपयोग किया है. उस पेज पर वापस जाने से आपके द्वारा की गई किसी क्रिया को दोहराने की आवश्यकता हो सकती है. क्या आप जारी रखना चाहते हैं?</translation>
 <translation id="8241712895048303527">इस साइट पर ब्लॉक करें</translation>
+<translation id="8242426110754782860">आगे बढ़ें</translation>
 <translation id="8249320324621329438">पिछली बार प्राप्त किया गया:</translation>
 <translation id="8253091569723639551">बिलिंग पता आवश्यक</translation>
 <translation id="825929999321470778">सेव किए गए सभी पासवर्ड दिखाएं</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index d485a1a..bcd4594 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">Otvorite stranicu u novoj anonimnoj kartici</translation>
 <translation id="8241707690549784388">Stranica koju ste tražili koristila je podatke koje ste unijeli. Vraćanje na tu stranicu može dovesti do ponavljanja poduzete radnje. Želite li nastaviti?</translation>
 <translation id="8241712895048303527">Blokiraj na ovoj web-lokaciji</translation>
+<translation id="8242426110754782860">Nastavi</translation>
 <translation id="8249320324621329438">Zadnje dohvaćanje:</translation>
 <translation id="8253091569723639551">Potrebna je adresa za naplatu</translation>
 <translation id="825929999321470778">Prikaži sve spremljene zaporke</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 5e0d3de..c4e5ebd8 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -998,6 +998,7 @@
 <translation id="8238581221633243064">Oldal megnyitása új inkognitóablakban</translation>
 <translation id="8241707690549784388">A keresett oldal a megadott információt használta. Ha visszatér arra az oldalra, akkor lehet, hogy az egyszer már megtett mozdulatok ismétlésre kerülnek. Mégis továbblép?</translation>
 <translation id="8241712895048303527">Letiltás ezen a webhelyen</translation>
+<translation id="8242426110754782860">Folytatás</translation>
 <translation id="8249320324621329438">Utolsó lekérés:</translation>
 <translation id="8253091569723639551">A számlázási cím megadása kötelező</translation>
 <translation id="825929999321470778">Az összes mentett jelszó megjelenítése</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 368e0c2..0e2822e3 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Buka halaman dalam tab Penyamaran baru</translation>
 <translation id="8241707690549784388">Halaman yang dicari menggunakan informasi yang Anda masukkan. Kembali ke halaman tersebut dapat menyebabkan pengulangan tindakan apa pun yang Anda lakukan. Apakah Anda ingin melanjutkan?</translation>
 <translation id="8241712895048303527">Blokir di situs ini</translation>
+<translation id="8242426110754782860">Lanjutkan</translation>
 <translation id="8249320324621329438">Terakhir diambil:</translation>
 <translation id="8253091569723639551">Perlu alamat penagihan</translation>
 <translation id="825929999321470778">Tampilkan Semua Sandi Tersimpan</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 8356194..d4b9ffe 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -996,6 +996,7 @@
 <translation id="8238581221633243064">Apri la pagina in una nuova scheda di navigazione in incognito</translation>
 <translation id="8241707690549784388">La pagina a cui stai tentando di accedere utilizzava informazioni inserite da te. Tornando a quella pagina, è possibile che eventuali azioni che hai eseguito vengano ripetute. Continuare?</translation>
 <translation id="8241712895048303527">Blocca su questo sito</translation>
+<translation id="8242426110754782860">Procedi</translation>
 <translation id="8249320324621329438">Ultimo recupero:</translation>
 <translation id="8253091569723639551">Indirizzo di fatturazione obbligatorio</translation>
 <translation id="825929999321470778">Mostra tutte le password salvate</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index eea8c5d..2f7b499 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -1005,6 +1005,7 @@
 <translation id="8238581221633243064">פתח את הדף בכרטיסייה חדשה של גלישה בסתר</translation>
 <translation id="8241707690549784388">הדף שאתה מחפש השתמש במידע שהזנת. החזרה לדף זה עלולה לגרום לכפילות בפעולות שביצעת. האם ברצונך להמשיך?</translation>
 <translation id="8241712895048303527">חסום באתר הזה</translation>
+<translation id="8242426110754782860">המשך</translation>
 <translation id="8249320324621329438">אוחזר לאחרונה:</translation>
 <translation id="8253091569723639551">יש להזין כתובת לחיוב</translation>
 <translation id="825929999321470778">הצגת כל הסיסמאות השמורות</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 19764aea..161ae7b 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">ページを新しいシークレット タブで開く</translation>
 <translation id="8241707690549784388">検索しているページは、入力した情報を使用しています。このページに戻った場合、操作のやり直しが発生する可能性があります。続行しますか?</translation>
 <translation id="8241712895048303527">このサイトでブロック</translation>
+<translation id="8242426110754782860">続行</translation>
 <translation id="8249320324621329438">前回の取得:</translation>
 <translation id="8253091569723639551">請求先住所が必要です</translation>
 <translation id="825929999321470778">保存したパスワードをすべて表示</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index bdb4a17..7c4defcc 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -993,6 +993,7 @@
 <translation id="8238581221633243064">ಪುಟವನ್ನು ಹೊಸ ಅದೃಶ್ಯ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="8241707690549784388">ನೀವು ಎದುರು ನೋಡುತ್ತಿರುವ ಪುಟ ನೀವು ನಮೂದಿಸಿದ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿದೆ. ಆ ಪುಟಕ್ಕೆ ಹಿಂದಿರುಗುವುದರಿಂದ ನೀವು ಮಾಡಿದ ಯಾವುದೇ ಕ್ರಿಯೆ ಪುನರಾವರ್ತಿಸುವಂತೆ ಮಾಡುತ್ತದೆ. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?</translation>
 <translation id="8241712895048303527">ಈ ಸೈಟ್‌ನಲ್ಲಿ ನಿರ್ಬಂಧಿಸಿ</translation>
+<translation id="8242426110754782860">ಮುಂದುವರಿಸು</translation>
 <translation id="8249320324621329438">ಕಳೆದ ಬಾರಿ ಪಡೆದಿರುವುದು:</translation>
 <translation id="8253091569723639551">ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="825929999321470778">ಉಳಿಸಿದ ಎಲ್ಲ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 48471e5..a7f58c13 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">새 시크릿 창에서 페이지 열기</translation>
 <translation id="8241707690549784388">찾고 있는 페이지에서 사용자가 입력한 정보를 사용했습니다. 해당 페이지로 돌아가면 기존 작업을 반복할 수 있습니다. 계속하시겠습니까?</translation>
 <translation id="8241712895048303527">이 사이트에서 차단</translation>
+<translation id="8242426110754782860">계속</translation>
 <translation id="8249320324621329438">마지막으로 가져온 시간:</translation>
 <translation id="8253091569723639551">청구지 주소 필요</translation>
 <translation id="825929999321470778">저장된 비밀번호 모두 표시</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index f4d64fe..ed02c0f 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -1001,6 +1001,7 @@
 <translation id="8238581221633243064">Atidarykite puslapį naujame inkognito skirtuke</translation>
 <translation id="8241707690549784388">Jūsų ieškomas puslapis ieškojo informacijos, kurią įvedėte. Grįžus į tą puslapį bet kokie jūsų atliekami veiksmai gali būti kartojami. Ar norite tęsti?</translation>
 <translation id="8241712895048303527">Blokuoti šioje svetainėje</translation>
+<translation id="8242426110754782860">Tęsti</translation>
 <translation id="8249320324621329438">Paskutinį kartą gauta:</translation>
 <translation id="8253091569723639551">Būtina pateikti atsiskaitymo adresą</translation>
 <translation id="825929999321470778">Rodyti visus išsaugotus slaptažodžius</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index d7886c4..7d8d0af4 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">Atvērt lapu jaunā inkognito režīma cilnē</translation>
 <translation id="8241707690549784388">Lapa, ko meklējāt, izmantoja jūsu ievadīto informāciju. Atgriešanās lapā var radīt jebkuras jūsu darbības atkārtojumu. Vai vēlaties turpināt?</translation>
 <translation id="8241712895048303527">Bloķēt šajā vietnē</translation>
+<translation id="8242426110754782860">Turpināt</translation>
 <translation id="8249320324621329438">Pēdējās pirmsielādes laiks:</translation>
 <translation id="8253091569723639551">Jānorāda norēķinu adrese.</translation>
 <translation id="825929999321470778">Rādīt visas saglabātās paroles</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index d2da341..65f8d73d 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -997,6 +997,7 @@
 <translation id="8238581221633243064">പുതിയൊരു അദൃശ്യ ടാബിൽ പേജ് തുറക്കുക</translation>
 <translation id="8241707690549784388">നിങ്ങള്‍ അന്വേഷിക്കുന്ന പേജ് നിങ്ങള്‍ രേഖപ്പെടുത്തിയ വിവരങ്ങള്‍ ഉപയോഗിക്കുന്നു. ആ പേജിലേക്ക് മടങ്ങുന്നത് നിങ്ങള്‍ ആവര്‍ത്തിക്കാവുന്ന ഏതെങ്കിലും പ്രവൃത്തിക്ക് കാരണമായേക്കും. തുടരാന്‍ നിങ്ങള്‍ ആഗ്രഹിക്കുന്നുണ്ടോ?</translation>
 <translation id="8241712895048303527">ഈ സൈറ്റിൽ ബ്ലോക്കുചെയ്യുക</translation>
+<translation id="8242426110754782860">തുടരുക</translation>
 <translation id="8249320324621329438">അവസാനം ലഭ്യമായത്:</translation>
 <translation id="8253091569723639551">ബില്ലിംഗ് വിലാസം ആവശ്യമാണ്</translation>
 <translation id="825929999321470778">സംരക്ഷിച്ച എല്ലാ പാസ്‌വേഡുകളും കാണിക്കുക</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 903b8e83..74afa11 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -1001,6 +1001,7 @@
 <translation id="8238581221633243064">पेज नवीन गुप्त टॅबमध्ये उघडा</translation>
 <translation id="8241707690549784388">आपण जे पृष्ठ शोधत आहत ते आपण एंटर केलेली माहिती वापरत आहे. त्या पृष्ठाकडे परत गेल्यास कदाचित आपण केलेल्या कोणत्याही क्रियेची पुनरावृत्ती होईल. आपण सुरू ठेवू इच्छिता?</translation>
 <translation id="8241712895048303527">या साइटवर ब्लॉक करा</translation>
+<translation id="8242426110754782860">पुढे जा</translation>
 <translation id="8249320324621329438">अंतिम प्राप्त केलेले:</translation>
 <translation id="8253091569723639551">बिलिंग पत्ता आवश्यक आहे</translation>
 <translation id="825929999321470778">सेव्ह केलेले सर्व पासवर्ड दाखवा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index a309d7c..af6bcb8 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -1001,6 +1001,7 @@
 <translation id="8238581221633243064">Buka halaman dalam tab Inkognito baharu</translation>
 <translation id="8241707690549784388">Halaman yang anda cari untuk maklumat terpakai yang anda masukkan. Kembali ke halaman tersebut mungkin menyebabkan mana-mana tindakan yang anda ambil akan diulang. Adakah anda mahu teruskan?</translation>
 <translation id="8241712895048303527">Sekat di tapak ini</translation>
+<translation id="8242426110754782860">Teruskan</translation>
 <translation id="8249320324621329438">Diambil kali terakhir:</translation>
 <translation id="8253091569723639551">Alamat pengebilan diperlukan</translation>
 <translation id="825929999321470778">Tunjukkan Semua Kata Laluan yang Disimpan</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index b1c9b3c..4473c44 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -995,6 +995,7 @@
 <translation id="8238581221633243064">Pagina openen op een nieuw incognitotabblad</translation>
 <translation id="8241707690549784388">De pagina die je zoekt, heeft informatie gebruikt die je hebt opgegeven Als je terugkeert naar deze pagina, worden acties die je hebt uitgevoerd, mogelijk herhaald. Wil je doorgaan?</translation>
 <translation id="8241712895048303527">Blokkeren op deze site</translation>
+<translation id="8242426110754782860">Doorgaan</translation>
 <translation id="8249320324621329438">Laatst opgehaald:</translation>
 <translation id="8253091569723639551">Factuuradres vereist</translation>
 <translation id="825929999321470778">Alle opgeslagen wachtwoorden weergeven</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index ddfaf86..9aea3d4 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -810,6 +810,7 @@
 <translation id="6897140037006041989">Brukeragent</translation>
 <translation id="6903319715792422884">Bidra til å gjøre Safe Browsing bedre ved å sende noe <ph name="BEGIN_WHITEPAPER_LINK" />systeminformasjon og sideinnhold<ph name="END_WHITEPAPER_LINK" /> til Google. <ph name="PRIVACY_PAGE_LINK" /></translation>
 <translation id="6915804003454593391">Bruker:</translation>
+<translation id="6944692733090228304">Du har skrevet inn passordet ditt på et nettsted som ikke administreres av <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. For å beskytte kontoen din må du ikke bruke det samme passordet i andre apper eller på andre nettsteder.</translation>
 <translation id="6945221475159498467">Velg</translation>
 <translation id="6948701128805548767">For å se hentemetoder og -krav, velg en adresse</translation>
 <translation id="6949872517221025916">Tilbakestill passordet</translation>
@@ -999,6 +1000,7 @@
 <translation id="8238581221633243064">Åpne siden i et nytt inkognitovindu</translation>
 <translation id="8241707690549784388">Siden du ser etter, brukte informasjon som du anga. Hvis du går tilbake til denne siden, kan det føre til at handlinger som er utført, blir gjentatt. Vil du fortsette?</translation>
 <translation id="8241712895048303527">Blokkér på dette nettstedet</translation>
+<translation id="8242426110754782860">Gå videre</translation>
 <translation id="8249320324621329438">Sist hentet:</translation>
 <translation id="8253091569723639551">Fakturaadresse er obligatorisk</translation>
 <translation id="825929999321470778">Vis alle lagrede passord</translation>
@@ -1034,6 +1036,7 @@
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> brukte for lang tid på å svare.</translation>
 <translation id="8503559462189395349">Chrome-passord</translation>
 <translation id="8503813439785031346">Brukernavn</translation>
+<translation id="8508648098325802031">Søk ikon</translation>
 <translation id="8543181531796978784">Du kan <ph name="BEGIN_ERROR_LINK" />rapportere et påvisningsproblem<ph name="END_ERROR_LINK" /> eller, hvis du forstår sikkerhetsrisikoen, <ph name="BEGIN_LINK" />gå til dette usikre nettstedet<ph name="END_LINK" />.</translation>
 <translation id="8543556556237226809">Har du spørsmål? Kontakt personen som administrer profilen din.</translation>
 <translation id="8553075262323480129">Oversettelsen mislyktes fordi sidens språk ikke kunne fastslås.</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index f75c362..404a95d 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Otwórz stronę w nowej karcie incognito</translation>
 <translation id="8241707690549784388">Strona, na której wyszukiwane są wprowadzone przez Ciebie informacje. Powrót do tej strony może spowodować konieczność powtórzenia wykonanych czynności. Czy chcesz kontynuować?</translation>
 <translation id="8241712895048303527">Blokuj na tej stronie</translation>
+<translation id="8242426110754782860">Dalej</translation>
 <translation id="8249320324621329438">Ostatnie pobieranie:</translation>
 <translation id="8253091569723639551">Wymagany jest adres rozliczeniowy</translation>
 <translation id="825929999321470778">Pokaż wszystkie zapisane hasła</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index c622842..68aed10 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Abrir página em uma nova guia anônima</translation>
 <translation id="8241707690549784388">A página que você está procurando usou as informações inseridas. Voltar à essa página poderá fazer com que todas as ações realizadas antes sejam repetidas. Quer continuar?</translation>
 <translation id="8241712895048303527">Bloquear neste site</translation>
+<translation id="8242426110754782860">Continuar</translation>
 <translation id="8249320324621329438">Última busca:</translation>
 <translation id="8253091569723639551">Endereço de faturamento necessário</translation>
 <translation id="825929999321470778">Mostrar todas as senhas salvas</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 5ddc0cf..04fcfbe 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">Abrir página num novo separador anónimo</translation>
 <translation id="8241707690549784388">A página que procura utilizou informações introduzidas por si. Regressar a essa página poderá originar a repetição de qualquer ação que tenha efetuado. Pretende continuar?</translation>
 <translation id="8241712895048303527">Bloquear neste site</translation>
+<translation id="8242426110754782860">Continuar</translation>
 <translation id="8249320324621329438">Última obtenção:</translation>
 <translation id="8253091569723639551">É necessário um endereço de faturação</translation>
 <translation id="825929999321470778">Mostrar todas as palavras-passe guardadas</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 96e354e..c3c7403a 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Deschide pagina într-o filă incognito nouă</translation>
 <translation id="8241707690549784388">Pagina pe care o cauți a utilizat informațiile pe care le-ai introdus. Întoarcerea la acea pagină ar putea face ca orice acțiune să fie repetată. Vrei să continui?</translation>
 <translation id="8241712895048303527">Blochează pe acest site</translation>
+<translation id="8242426110754782860">Continuă</translation>
 <translation id="8249320324621329438">Ultima preluare:</translation>
 <translation id="8253091569723639551">Adresa de facturare este obligatorie</translation>
 <translation id="825929999321470778">Afișează toate parolele salvate</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index e3c63dd1..7fde3e0 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -809,6 +809,7 @@
 <translation id="6897140037006041989">User Agent</translation>
 <translation id="6903319715792422884">Чтобы улучшить режим Безопасного просмотра, вы можете <ph name="BEGIN_WHITEPAPER_LINK" />отправлять системную информацию и контент страниц<ph name="END_WHITEPAPER_LINK" /> в Google. <ph name="PRIVACY_PAGE_LINK" /></translation>
 <translation id="6915804003454593391">Пользователь:</translation>
+<translation id="6944692733090228304">Вы ввели пароль на сайте, который не находится под управлением организации <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Чтобы защитить свой аккаунт, не используйте этот пароль для других приложений и сайтов.</translation>
 <translation id="6945221475159498467">Выбрать</translation>
 <translation id="6948701128805548767">Выберите адрес, чтобы посмотреть способы и условия получения.</translation>
 <translation id="6949872517221025916">Сброс пароля</translation>
@@ -998,6 +999,7 @@
 <translation id="8238581221633243064">Открыть страницу в новой вкладке инкогнито</translation>
 <translation id="8241707690549784388">На странице, которую вы ищете, использовалась введенная вами информация. При возврате на эту страницу может потребоваться повторить выполненные ранее действия. Продолжить?</translation>
 <translation id="8241712895048303527">Блокировать на этом сайте</translation>
+<translation id="8242426110754782860">Продолжить</translation>
 <translation id="8249320324621329438">Время последней загрузки:</translation>
 <translation id="8253091569723639551">Необходимо указать платежный адрес</translation>
 <translation id="825929999321470778">Показать все сохраненные пароли</translation>
@@ -1033,6 +1035,7 @@
 <translation id="8498891568109133222">Превышено время ожидания ответа от сайта <ph name="HOST_NAME" />.</translation>
 <translation id="8503559462189395349">Пароли Chrome</translation>
 <translation id="8503813439785031346">Имя пользователя</translation>
+<translation id="8508648098325802031">Значок поиска</translation>
 <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />Сообщите о зараженном сайте<ph name="END_ERROR_LINK" />. Если вы готовы подвергнуть риску личные данные, то можете <ph name="BEGIN_LINK" />перейти на страницу<ph name="END_LINK" />.</translation>
 <translation id="8543556556237226809">Есть вопросы? Обратитесь к человеку, который контролирует ваш профиль.</translation>
 <translation id="8553075262323480129">Перевод не удался, так как не удается определить язык страницы.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 04f58a05..6fc29a1 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -995,6 +995,7 @@
 <translation id="8238581221633243064">Otvorte stránku na novej karte inkognito</translation>
 <translation id="8241707690549784388">Vami hľadaná stránka použila informácie, ktoré ste zadali. Návrat na túto stránku môže spôsobiť zopakovanie akcie, ktorú ste vykonali. Chcete pokračovať?</translation>
 <translation id="8241712895048303527">Blokovať na tomto webe</translation>
+<translation id="8242426110754782860">Pokračovať</translation>
 <translation id="8249320324621329438">Naposledy načítané:</translation>
 <translation id="8253091569723639551">Fakturačná adresa je povinná</translation>
 <translation id="825929999321470778">Zobraziť všetky uložené heslá</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 5a21700d..ff90dda 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Odpiranje strani v novem zavihku brez beleženja zgodovine.</translation>
 <translation id="8241707690549784388">Stran, ki jo iščete, je uporabila informacije, ki ste jih vnesli. Z vrnitvijo na to stran se bodo morda ponovila vsa vaša dejanja, ki ste jih opravili. Ali želite nadaljevati?</translation>
 <translation id="8241712895048303527">Blokiraj na tem spletnem mestu</translation>
+<translation id="8242426110754782860">Naprej</translation>
 <translation id="8249320324621329438">Nazadnje preneseno:</translation>
 <translation id="8253091569723639551">Naslov za izstavitev računa je obvezen</translation>
 <translation id="825929999321470778">Prikaz vseh shranjenih gesel</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index cf03403..aa8d1561 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -999,6 +999,7 @@
 <translation id="8238581221633243064">Отворите страницу у новој картици без архивирања</translation>
 <translation id="8241707690549784388">Страница коју тражите користила је информације које сте унели. Повратак на ту страницу може да проузрокује потребну понављања радњи које сте извршили. Желите ли да наставите?</translation>
 <translation id="8241712895048303527">Блокирај на овом сајту</translation>
+<translation id="8242426110754782860">Настави</translation>
 <translation id="8249320324621329438">Последње учитано:</translation>
 <translation id="8253091569723639551">Адреса за обрачун је обавезна</translation>
 <translation id="825929999321470778">Прикажи све сачуване лозинке</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 220bb7b..ff45f04 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Öppna sidan på en ny inkognitoflik</translation>
 <translation id="8241707690549784388">Önskad sida använder information som du har angett. Om du återgår till sidan kan eventuella åtgärder på sidan upprepas. Vill du fortsätta?</translation>
 <translation id="8241712895048303527">Blockera på den här webbplatsen</translation>
+<translation id="8242426110754782860">Fortsätt</translation>
 <translation id="8249320324621329438">Senast hämtad:</translation>
 <translation id="8253091569723639551">En faktureringsadress måste anges</translation>
 <translation id="825929999321470778">Visa alla sparade lösenord</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index 74fd415..1d98fc47 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Fungua ukurasa kwenye kichupo fiche kipya</translation>
 <translation id="8241707690549784388">Ukurasa unaotafuta ulitumia maelezo uliyoyaingiza. Kurudi kwenye ukurasa huo huenda kukasababisha tendo lolote ulilofanya lirudiwe. Je, ungependa kuendelea?</translation>
 <translation id="8241712895048303527">Zuia kwenye tovuti hii</translation>
+<translation id="8242426110754782860">Endelea</translation>
 <translation id="8249320324621329438">Iliyoletwa mwisho:</translation>
 <translation id="8253091569723639551">Anwani ya kutuma bili sharti iandikwe</translation>
 <translation id="825929999321470778">Onyesha Manenosiri Yote Yaliyohifadhiwa</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index dc5245c..99dcb15b 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -996,6 +996,7 @@
 <translation id="8238581221633243064">புதிய மறைநிலைத் தாவலில் பக்கத்தைத் திறக்கவும்</translation>
 <translation id="8241707690549784388">நீங்கள் தேடும் பக்கமானது நீங்கள் உள்ளிட்ட தகவலைப் பயன்படுத்தியது. மீண்டும் அந்த பக்கத்திற்கு திரும்பினால், நீங்கள் செய்த ஏதேனும் செயலை மீண்டும் செய்ய வேண்டியிருக்கலாம். தொடர விரும்புகிறீர்களா?</translation>
 <translation id="8241712895048303527">இந்தத் தளத்தில் தடு</translation>
+<translation id="8242426110754782860">தொடருக</translation>
 <translation id="8249320324621329438">கடைசியாக எடுத்தது:</translation>
 <translation id="8253091569723639551">பில்லிங் முகவரி தேவை</translation>
 <translation id="825929999321470778">சேமித்த எல்லாக் கடவுச்சொற்களையும் காட்டு</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index b6dfb19..7aa26a79 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -998,6 +998,7 @@
 <translation id="8238581221633243064">కొత్త అజ్ఞాత ట్యాబ్‌లో పేజీని తెరవండి</translation>
 <translation id="8241707690549784388">మీరు వెతికే పేజీ మీరు ఎంటర్ చేసిన సమాచారాన్ని ఉపయోగించుకుంది. ఆ పేజీకి తిరిగి వెళ్ళడం ద్వారా మీరు చేసిన ఏ చర్య అయినా పునరావృతం చెయ్యవలసి వస్తుంది. మీరు కొనసాగాలనుకుంటున్నారా?</translation>
 <translation id="8241712895048303527">ఈ సైట్‌లో బ్లాక్ చేయి</translation>
+<translation id="8242426110754782860">కొనసాగు</translation>
 <translation id="8249320324621329438">చివరగా పొందబడినవి:</translation>
 <translation id="8253091569723639551">బిల్లింగ్ చిరునామా ఆవశ్యకం</translation>
 <translation id="825929999321470778">సేవ్ చేసిన అన్ని పాస్‌వర్డ్‌లను చూపండి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index b6b6db55..7b47456 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">เปิดหน้าเว็บในแท็บไม่ระบุตัวตนใหม่</translation>
 <translation id="8241707690549784388">หน้าที่คุณกำลังมองหาใช้ข้อมูลที่คุณได้ป้อนไว้แล้ว การกลับไปสู่หน้านั้นอาจทำให้คุณต้องทำซ้ำการดำเนินการใดๆ ที่คุณทำแล้ว คุณต้องการดำเนินการต่อหรือไม่</translation>
 <translation id="8241712895048303527">บล็อกในไซต์นี้</translation>
+<translation id="8242426110754782860">ดำเนินการต่อ</translation>
 <translation id="8249320324621329438">เรียกดูครั้งสุดท้ายเมื่อ:</translation>
 <translation id="8253091569723639551">ต้องใส่ที่อยู่สำหรับการเรียกเก็บเงิน</translation>
 <translation id="825929999321470778">แสดงรหัสผ่านที่บันทึกไว้ทั้งหมด</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 3027c86..9b541d6a 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Sayfayı yeni bir Gizli sekmede aç</translation>
 <translation id="8241707690549784388">Aradığınız sayfa, girdiğiniz bilgileri kullandı. O sayfaya dönmeniz, gerçekleştirdiğiniz işlemlerin tekrarlanmasına yol açabilir. Devam etmek istiyor musunuz?</translation>
 <translation id="8241712895048303527">Bu sitede engelle</translation>
+<translation id="8242426110754782860">Devam et</translation>
 <translation id="8249320324621329438">Son getirilen:</translation>
 <translation id="8253091569723639551">Fatura adresi gerekli</translation>
 <translation id="825929999321470778">Tüm Kayıtlı Şifreleri Göster</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index c01ef31..caca414f 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Відкрити сторінку в новій анонімній вкладці</translation>
 <translation id="8241707690549784388">Сторінка, яку ви шукаєте, використовувала інформацію, введену вами. Повернення до такої сторінки може призвести до повторення ваших попередніх дій. Ви дійсно бажаєте продовжити?</translation>
 <translation id="8241712895048303527">Блокувати на цьому сайті</translation>
+<translation id="8242426110754782860">Продовжити</translation>
 <translation id="8249320324621329438">Востаннє отримано:</translation>
 <translation id="8253091569723639551">Потрібно вказати платіжну адресу</translation>
 <translation id="825929999321470778">Показати всі збережені паролі</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index c112a5e3..040e169 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">Mở trang trong tab Ẩn danh mới</translation>
 <translation id="8241707690549784388">Trang mà bạn đang tìm sử dụng thông tin bạn đã nhập vào. Việc quay lại trang đó có thể lặp lại bất kỳ tác vụ nào bạn đã thực hiện. Bạn có muốn tiếp tục không?</translation>
 <translation id="8241712895048303527">Chặn trên trang web này</translation>
+<translation id="8242426110754782860">Tiếp tục</translation>
 <translation id="8249320324621329438">Tìm nạp lần cuối:</translation>
 <translation id="8253091569723639551">Yêu cầu địa chỉ thanh toán</translation>
 <translation id="825929999321470778">Hiển thị tất cả các mật khẩu đã lưu</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index 0055924..8875c5c 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -996,6 +996,7 @@
 <translation id="8238581221633243064">在新的无痕式标签页中打开网页</translation>
 <translation id="8241707690549784388">您所查找的网页要使用已输入的信息。返回此页可能需要重复已进行的所有操作。是否要继续操作?</translation>
 <translation id="8241712895048303527">在此网站上拦截</translation>
+<translation id="8242426110754782860">继续</translation>
 <translation id="8249320324621329438">最后一次抓取时间:</translation>
 <translation id="8253091569723639551">账单邮寄地址是必填项</translation>
 <translation id="825929999321470778">显示所有已保存的密码</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index a5b157f..74169b8 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -1000,6 +1000,7 @@
 <translation id="8238581221633243064">在新的無痕式分頁中開啟網頁</translation>
 <translation id="8241707690549784388">你尋找的網頁使用了你輸入的資料。返回該頁會重複你剛才的行動。你確定要繼續嗎?</translation>
 <translation id="8241712895048303527">禁止這個網站顯示廣告</translation>
+<translation id="8242426110754782860">Proceed</translation>
 <translation id="8249320324621329438">上次擷取時間:</translation>
 <translation id="8253091569723639551">請提供帳單地址</translation>
 <translation id="825929999321470778">顯示所有已儲存的密碼</translation>
diff --git a/components/tracing/BUILD.gn b/components/tracing/BUILD.gn
index 4ab521e..c46546a 100644
--- a/components/tracing/BUILD.gn
+++ b/components/tracing/BUILD.gn
@@ -3,6 +3,11 @@
 # found in the LICENSE file.
 
 import("//testing/test.gni")
+import("//build/config/compiler/compiler.gni")
+
+config("wrap_find_exidx") {
+  ldflags = [ "-Wl,-wrap,dl_unwind_find_exidx" ]
+}
 
 component("tracing") {
   sources = [
@@ -21,6 +26,18 @@
     "//base",
     "//ipc",
   ]
+
+  if (is_android && can_unwind_with_cfi_table && is_official_build) {
+    sources += [
+      "common/stack_unwinder_android.cc",
+      "common/stack_unwinder_android.h",
+    ]
+    deps += [ "//buildtools/third_party/libunwind" ]
+    include_dirs = [ "//buildtools/third_party/libunwind/trunk/include" ]
+
+    # stack_unwinder_android.cc overrides the dl_unwind_find_exidx function.
+    all_dependent_configs = [ ":wrap_find_exidx" ]
+  }
 }
 
 component("startup_tracing") {
@@ -63,6 +80,10 @@
     sources += [ "common/trace_startup_config_unittest.cc" ]
     deps += [ ":startup_tracing" ]
   }
+
+  if (is_android && can_unwind_with_cfi_table && is_official_build) {
+    sources += [ "common/stack_unwinder_android_unittest.cc" ]
+  }
 }
 
 test("tracing_perftests") {
diff --git a/components/tracing/common/stack_unwinder_android.cc b/components/tracing/common/stack_unwinder_android.cc
new file mode 100644
index 0000000..2e1e662
--- /dev/null
+++ b/components/tracing/common/stack_unwinder_android.cc
@@ -0,0 +1,363 @@
+// 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/tracing/common/stack_unwinder_android.h"
+
+#include <linux/futex.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <syscall.h>
+#include "link.h"
+
+#include <algorithm>
+
+#include "base/debug/proc_maps_linux.h"
+#include "base/logging.h"
+#include "base/trace_event/cfi_backtrace_android.h"
+#include "libunwind.h"
+
+using base::trace_event::CFIBacktraceAndroid;
+using base::debug::MappedMemoryRegion;
+
+namespace {
+
+// Waitable event implementation with futex and without DCHECK(s), since signal
+// handlers cannot allocate memory or use pthread api.
+class AsyncSafeWaitableEvent {
+ public:
+  AsyncSafeWaitableEvent() { base::subtle::Release_Store(&futex_, 0); }
+  ~AsyncSafeWaitableEvent() {}
+
+  bool Wait() {
+    // futex() can wake up spuriously if this memory address was previously used
+    // for a pthread mutex. So, also check the condition.
+    while (true) {
+      int res = syscall(SYS_futex, &futex_, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0,
+                        nullptr, nullptr, 0);
+      if (base::subtle::Acquire_Load(&futex_) != 0)
+        return true;
+      if (res != 0)
+        return false;
+    }
+  }
+
+  void Signal() {
+    base::subtle::Release_Store(&futex_, 1);
+    syscall(SYS_futex, &futex_, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1, nullptr,
+            nullptr, 0);
+  }
+
+ private:
+  int futex_;
+};
+
+// Scoped signal event that calls Signal on the AsyncSafeWaitableEvent at
+// destructor.
+class ScopedEventSignaller {
+ public:
+  ScopedEventSignaller(AsyncSafeWaitableEvent* event) : event_(event) {}
+  ~ScopedEventSignaller() { event_->Signal(); }
+
+ private:
+  AsyncSafeWaitableEvent* event_;
+};
+
+// Unwinds from given |cursor| readable by libunwind, and returns
+// the number of frames added to the output. This function can unwind through
+// android framework and then chrome functions. It cannot handle the cases when
+// the chrome functions are called by android framework again, since we cannot
+// create the right context for libunwind from chrome functions.
+// TODO(ssid): This function should support unwinding from chrome to android
+// libraries also.
+size_t TraceStackWithContext(unw_cursor_t* cursor,
+                             CFIBacktraceAndroid* cfi_unwinder,
+                             tracing::StackUnwinderAndroid* unwinder,
+                             const void** out_trace,
+                             size_t max_depth) {
+  size_t depth = 0;
+  unw_word_t ip = 0, sp = 0;
+  do {
+    unw_get_reg(cursor, UNW_REG_IP, &ip);
+    unw_get_reg(cursor, UNW_REG_SP, &sp);
+
+    // If address is in chrome library, then use CFI unwinder since chrome might
+    // not have EHABI unwind tables.
+    if (CFIBacktraceAndroid::is_chrome_address(ip))
+      break;
+
+    // Break if pc is not from any mapped region. Something went wrong while
+    // unwinding.
+    if (!unwinder->IsAddressMapped(ip))
+      break;
+
+    // If it is chrome address, the cfi unwinder will include it.
+    out_trace[depth++] = reinterpret_cast<void*>(ip);
+  } while (unw_step(cursor) && depth < max_depth - 1);
+
+  if (CFIBacktraceAndroid::is_chrome_address(ip)) {
+    // Continue unwinding CFI unwinder if we found stack frame from chrome
+    // library.
+    return depth +
+           cfi_unwinder->Unwind(ip, sp, out_trace + depth, max_depth - depth);
+  }
+  return depth;
+}
+
+// Returns the offset of stack pointer for the given program counter in chrome
+// library.
+bool GetCFIForPC(CFIBacktraceAndroid* cfi_unwinder,
+                 uintptr_t pc,
+                 CFIBacktraceAndroid::CFIRow* cfi) {
+  return cfi_unwinder->FindCFIRowForPC(
+      pc - CFIBacktraceAndroid::executable_start_addr(), cfi);
+}
+
+constexpr size_t kMaxStackBytesCopied = 4096;
+
+// Struct to store the arguments to the signal handler.
+struct HandlerParams {
+  const tracing::StackUnwinderAndroid* unwinder;
+  // The event is signalled when signal handler is done executing.
+  AsyncSafeWaitableEvent* event;
+
+  // Return values:
+  // Succesfully copied the stack segment.
+  bool* success;
+  // The register context of the thread used by libunwind.
+  unw_context_t* context;
+  // The value of Stack pointer of the thread.
+  uintptr_t* sp;
+  // The address where the full stack is copied to.
+  char* copy;
+};
+
+// Argument passed to the ThreadSignalHandler() from the sampling thread to the
+// sampled (stopped) thread. This value is set just before sending kill signal
+// to the thread and reset when handler is done.
+base::subtle::AtomicWord g_handler_params;
+
+// The signal handler is called on the stopped thread as an additional stack
+// frame. This relies on no alternate sigalstack() being set. This function
+// skips the handler frame on stack and unwinds the rest of the stack frames.
+// This function should use async-safe functions only. The only call that could
+// allocte memory on heap would be the cache in cfi unwinder. We need to ensure
+// that AllocateCacheForCurrentThread() is called on the stopped thread before
+// trying to get stack trace from the thread. See
+// https://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html#Nonreentrancy.
+static void ThreadSignalHandler(int n, siginfo_t* siginfo, void* sigcontext) {
+  HandlerParams* params = reinterpret_cast<HandlerParams*>(
+      base::subtle::Acquire_Load(&g_handler_params));
+  ScopedEventSignaller e(params->event);
+  *params->success = false;
+
+  uintptr_t sp = 0;
+  if (unw_getcontext(params->context) != 0)
+    return;
+
+  asm volatile("mov %0, sp" : "=r"(sp));
+  *params->sp = sp;
+
+  uintptr_t stack_base_addr = params->unwinder->GetEndAddressOfRegion(sp);
+  size_t size = stack_base_addr - sp;
+  // TODO(ssid): If stack_base_addr is 0 here, then we need to reload the
+  // memory mapped regions.
+  if (stack_base_addr == 0 || size > kMaxStackBytesCopied)
+    return;
+  memcpy(params->copy, reinterpret_cast<void*>(sp), size);
+  *params->success = true;
+}
+
+// ARM EXIDX table contains addresses in sorted order with unwind data, each of
+// 32 bits.
+struct FakeExidx {
+  uintptr_t pc;
+  uintptr_t index_data;
+};
+
+}  // namespace
+
+extern "C" {
+
+_Unwind_Ptr __real_dl_unwind_find_exidx(_Unwind_Ptr, int*);
+
+// Override the default |dl_unwind_find_exidx| function used by libunwind to
+// give a fake unwind table just for the handler function. Otherwise call the
+// original function. Libunwind marks the cursor invalid if it finds even one
+// frame without unwind info. Mocking the info keeps the unwind cursor valid
+// after unwind_init_local() within ThreadSignalHandler().
+__attribute__((visibility("default"), noinline)) _Unwind_Ptr
+__wrap_dl_unwind_find_exidx(_Unwind_Ptr pc, int* length) {
+  if (!CFIBacktraceAndroid::is_chrome_address(pc)) {
+    return __real_dl_unwind_find_exidx(pc, length);
+  }
+  // Fake exidx table that is passed to libunwind to work with chrome functions.
+  // 0x80000000 has high bit set to 1. This means the unwind data is inline and
+  // not in exception table (section 5 EHABI). 0 on the second high byte causes
+  // a 0 proceedure to be lsda. But this is never executed since the pc and sp
+  // will be overriden, before calling unw_step.
+  static const FakeExidx chrome_exidx_data[] = {
+      {CFIBacktraceAndroid::executable_start_addr(), 0x80000000},
+      {CFIBacktraceAndroid::executable_end_addr(), 0x80000000}};
+  *length = sizeof(chrome_exidx_data);
+  return reinterpret_cast<_Unwind_Ptr>(chrome_exidx_data);
+}
+
+}  // extern "C"
+
+namespace tracing {
+
+StackUnwinderAndroid::StackUnwinderAndroid() {}
+StackUnwinderAndroid::~StackUnwinderAndroid() {}
+
+//  static
+StackUnwinderAndroid* StackUnwinderAndroid::GetInstance() {
+  static StackUnwinderAndroid* instance = new StackUnwinderAndroid();
+  return instance;
+}
+
+void StackUnwinderAndroid::Initialize() {
+  DCHECK(!is_initialized_);
+  is_initialized_ = true;
+
+  // Parses /proc/self/maps.
+  std::string contents;
+  if (!base::debug::ReadProcMaps(&contents)) {
+    NOTREACHED();
+  }
+  if (!base::debug::ParseProcMaps(contents, &regions_)) {
+    NOTREACHED();
+  }
+  std::sort(regions_.begin(), regions_.end(),
+            [](const MappedMemoryRegion& a, const MappedMemoryRegion& b) {
+              return a.start < b.start;
+            });
+}
+
+size_t StackUnwinderAndroid::TraceStack(const void** out_trace,
+                                        size_t max_depth) {
+  DCHECK(is_initialized_);
+  unw_cursor_t cursor;
+  unw_context_t context;
+
+  if (unw_getcontext(&context) != 0)
+    return 0;
+  if (unw_init_local(&cursor, &context) != 0)
+    return 0;
+  return TraceStackWithContext(&cursor,
+                               CFIBacktraceAndroid::GetInitializedInstance(),
+                               this, out_trace, max_depth);
+}
+
+size_t StackUnwinderAndroid::TraceStack(base::PlatformThreadId tid,
+                                        const void** out_trace,
+                                        size_t max_depth) {
+  // Stops the thread with given tid with a signal handler. The signal handler
+  // copies the stack of the thread and returns. This function tries to unwind
+  // stack frames from the copied stack.
+  DCHECK(is_initialized_);
+  AsyncSafeWaitableEvent wait_event;
+  char copy[kMaxStackBytesCopied];
+  bool copied = false;
+  unw_context_t context;
+  uintptr_t sp = 0;
+  HandlerParams params = {this, &wait_event, &copied, &context, &sp, copy};
+  base::subtle::Release_Store(&g_handler_params,
+                              reinterpret_cast<uintptr_t>(&params));
+
+  // Change the signal handler for the thread to unwind function, which should
+  // execute on the stack so that we will be able to unwind.
+  struct sigaction act;
+  struct sigaction oact;
+  memset(&act, 0, sizeof(act));
+  act.sa_sigaction = ThreadSignalHandler;
+  // TODO(ssid): SA_ONSTACK will not work if signalstack was set. So, unwind
+  // should work without this flag.
+  act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK;
+  sigemptyset(&act.sa_mask);
+  // SIGURG is chosen here because we observe no crashes with this signal and
+  // neither Chrome or the AOSP sets up a special handler for this signal.
+  if (!sigaction(SIGURG, &act, &oact)) {
+    kill(tid, SIGURG);
+    bool finished_waiting = wait_event.Wait();
+
+    bool changed = sigaction(SIGURG, &oact, &act) == 0;
+    DCHECK(changed);
+    if (!finished_waiting) {
+      NOTREACHED();
+      return 0;
+    }
+  }
+  base::subtle::Release_Store(&g_handler_params, 0);
+  if (!copied)
+    return 0;
+
+  // Context contains list of saved registers. Replace the SP to the copied
+  // stack. The SP should be one of the first 16 registers.
+  bool replaced_sp = false;
+  for (size_t i = 0; i < 17; ++i) {
+    uintptr_t* data = reinterpret_cast<uintptr_t*>(&context) + i;
+    if (*data == sp) {
+      *data = reinterpret_cast<uintptr_t>(copy);
+      replaced_sp = true;
+      break;
+    }
+  }
+  DCHECK(replaced_sp);
+
+  // Initialize an unwind cursor on copied stack.
+  unw_cursor_t cursor;
+  if (unw_init_local(&cursor, &context) != 0)
+    return 0;
+  uintptr_t ip = 0;
+  unw_get_reg(&cursor, UNW_REG_SP, &sp);
+  DCHECK_EQ(sp, reinterpret_cast<uintptr_t>(copy));
+  unw_get_reg(&cursor, UNW_REG_IP, &ip);
+
+  // Unwind handler function (ThreadSignalHandler()) since libunwind cannot
+  // handle chrome functions. Then call either libunwind or use chrome's
+  // unwinder based on the next function in the stack.
+  auto* cfi_unwinder = CFIBacktraceAndroid::GetInitializedInstance();
+  static CFIBacktraceAndroid::CFIRow cfi;
+  static bool found = GetCFIForPC(cfi_unwinder, ip, &cfi);
+  if (!found)
+    return 0;
+  sp = sp + cfi.cfa_offset;
+  memcpy(&ip, reinterpret_cast<uintptr_t*>(sp - cfi.ra_offset),
+         sizeof(uintptr_t));
+
+  // Do not use libunwind if we stopped at chrome frame.
+  if (CFIBacktraceAndroid::is_chrome_address(ip))
+    return cfi_unwinder->Unwind(ip, sp, out_trace, max_depth);
+
+  // Reset the unwind cursor to previous function and continue with libunwind.
+  // TODO(ssid): Dynamic allocation functions might require registers to be
+  // restored.
+  unw_set_reg(&cursor, UNW_REG_SP, sp);
+  unw_set_reg(&cursor, UNW_REG_IP, ip);
+
+  return TraceStackWithContext(&cursor, cfi_unwinder, this, out_trace,
+                               max_depth);
+}
+
+uintptr_t StackUnwinderAndroid::GetEndAddressOfRegion(uintptr_t addr) const {
+  auto it =
+      std::lower_bound(regions_.begin(), regions_.end(), addr,
+                       [](const MappedMemoryRegion& region, uintptr_t addr) {
+                         return region.start < addr;
+                       });
+  if (it == regions_.begin())
+    return 0;
+  --it;
+  if (it->start <= addr && it->end > addr)
+    return it->end;
+  return 0;
+}
+
+bool StackUnwinderAndroid::IsAddressMapped(uintptr_t pc) const {
+  // TODO(ssid): We only need to check regions which are file mapped.
+  return GetEndAddressOfRegion(pc) != 0;
+}
+
+}  // namespace tracing
diff --git a/components/tracing/common/stack_unwinder_android.h b/components/tracing/common/stack_unwinder_android.h
new file mode 100644
index 0000000..a3a6078
--- /dev/null
+++ b/components/tracing/common/stack_unwinder_android.h
@@ -0,0 +1,60 @@
+// 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_TRACING_COMMON_STACK_UNWINDER_ANDROID_H_
+#define COMPONENTS_TRACING_COMMON_STACK_UNWINDER_ANDROID_H_
+
+#include <map>
+
+#include "base/debug/proc_maps_linux.h"
+#include "base/threading/platform_thread.h"
+#include "components/tracing/tracing_export.h"
+
+namespace tracing {
+
+// Utility to unwind stacks for current thread on ARM devices. Contains ability
+// to unwind stacks based on EHABI section in Android libraries and using the
+// custom stack unwind information in Chrome. This works on top of
+// base::trace_event::CFIBacktraceAndroid, which unwinds Chrome only stacks.
+class TRACING_EXPORT StackUnwinderAndroid {
+ public:
+  static StackUnwinderAndroid* GetInstance();
+
+  // Intializes the unwinder for current process. It finds all loaded libraries
+  // in current process and also initializes CFIBacktraceAndroid, with file IO.
+  void Initialize();
+
+  // Unwinds stack frames for current thread and stores the program counters in
+  // |out_trace|, and returns the number of frames stored.
+  size_t TraceStack(const void** out_trace, size_t max_depth);
+
+  // Same as above function, but pauses the thread with the given |tid| and then
+  // unwinds. |tid| should not be current thread's.
+  size_t TraceStack(base::PlatformThreadId tid,
+                    const void** out_trace,
+                    size_t max_depth);
+
+  // Returns the end address of the memory map with given |addr|.
+  uintptr_t GetEndAddressOfRegion(uintptr_t addr) const;
+
+  // Returns true if the given |pc| was part of any mapped segments in the
+  // process.
+  bool IsAddressMapped(uintptr_t pc) const;
+
+ private:
+  StackUnwinderAndroid();
+  ~StackUnwinderAndroid();
+
+  bool is_initialized_ = false;
+
+  // Stores all the memory mapped regions in the current process, including all
+  // the files mapped and anonymous regions. This data could be stale, but the
+  // error caused by changes in library loads would be missing stackframes and
+  // is acceptable.
+  std::vector<base::debug::MappedMemoryRegion> regions_;
+};
+
+}  // namespace tracing
+
+#endif  // COMPONENTS_TRACING_COMMON_STACK_UNWINDER_ANDROID_H_
diff --git a/components/tracing/common/stack_unwinder_android_unittest.cc b/components/tracing/common/stack_unwinder_android_unittest.cc
new file mode 100644
index 0000000..ab0f9013
--- /dev/null
+++ b/components/tracing/common/stack_unwinder_android_unittest.cc
@@ -0,0 +1,95 @@
+// 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/tracing/common/stack_unwinder_android.h"
+
+#include "base/synchronization/waitable_event.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/trace_event/cfi_backtrace_android.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace tracing {
+namespace {
+
+const size_t kMaxStackFrames = 40;
+
+class StackUnwinderTest : public testing::Test {
+ public:
+  StackUnwinderTest() : testing::Test() {}
+  ~StackUnwinderTest() override {}
+
+  void SetUp() override {
+    StackUnwinderAndroid::GetInstance()->Initialize();
+    base::trace_event::CFIBacktraceAndroid::GetInitializedInstance()
+        ->AllocateCacheForCurrentThread();
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(StackUnwinderTest);
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+};
+
+uintptr_t GetCurrentPC() {
+  return reinterpret_cast<uintptr_t>(__builtin_return_address(0));
+}
+
+}  // namespace
+
+TEST_F(StackUnwinderTest, UnwindCurrentThread) {
+  const void* frames[kMaxStackFrames];
+  size_t result =
+      StackUnwinderAndroid::GetInstance()->TraceStack(frames, kMaxStackFrames);
+  EXPECT_GT(result, 0u);
+
+  // Since we are starting from chrome library function (this), all the unwind
+  // frames will be chrome frames.
+  for (size_t i = 0; i < result; ++i) {
+    EXPECT_TRUE(
+        base::trace_event::CFIBacktraceAndroid::GetInitializedInstance()
+            ->is_chrome_address(reinterpret_cast<uintptr_t>(frames[i])));
+  }
+}
+
+TEST_F(StackUnwinderTest, UnwindOtherThread) {
+  base::WaitableEvent unwind_finished_event;
+  auto task_runner = base::CreateSingleThreadTaskRunnerWithTraits(
+      {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
+
+  auto callback = [](base::PlatformThreadId tid,
+                     base::WaitableEvent* unwind_finished_event,
+                     uintptr_t test_pc) {
+    const void* frames[kMaxStackFrames];
+    size_t result = StackUnwinderAndroid::GetInstance()->TraceStack(
+        tid, frames, kMaxStackFrames);
+    EXPECT_GT(result, 0u);
+    for (size_t i = 0; i < result; ++i) {
+      uintptr_t addr = reinterpret_cast<uintptr_t>(frames[i]);
+      EXPECT_TRUE(StackUnwinderAndroid::GetInstance()->IsAddressMapped(addr));
+    }
+
+    unwind_finished_event->Signal();
+  };
+
+  // Post task on background thread to unwind the current thread.
+  task_runner->PostTask(
+      FROM_HERE, base::BindOnce(callback, base::PlatformThread::CurrentId(),
+                                &unwind_finished_event, GetCurrentPC()));
+
+  // While the background thread is trying to unwind make some slow framework
+  // calls (malloc) so that the current thread can be stopped in framework
+  // library functions on stack.
+  // TODO(ssid): Test for reliable unwinding through non-chrome and chrome
+  // frames.
+  while (true) {
+    std::vector<int> temp;
+    temp.reserve(kMaxStackFrames);
+    usleep(100);
+
+    if (unwind_finished_event.IsSignaled())
+      break;
+  }
+}
+
+}  // namespace tracing
diff --git a/components/version_info/BUILD.gn b/components/version_info/BUILD.gn
index 8fbad36..073db62 100644
--- a/components/version_info/BUILD.gn
+++ b/components/version_info/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/chrome_build.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//chrome/process_version_rc_template.gni")  # For branding_file_path.
 
@@ -53,9 +54,9 @@
 process_version("generate_version_info") {
   template_file = "version_info_values.h.version"
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
     branding_file_path,
+    lastchange_file,
   ]
   output = "$target_gen_dir/version_info_values.h"
 }
diff --git a/components/viz/host/client_frame_sink_video_capturer.cc b/components/viz/host/client_frame_sink_video_capturer.cc
index 433c6d7..2b38767 100644
--- a/components/viz/host/client_frame_sink_video_capturer.cc
+++ b/components/viz/host/client_frame_sink_video_capturer.cc
@@ -24,22 +24,30 @@
   EstablishConnection();
 }
 
-ClientFrameSinkVideoCapturer::~ClientFrameSinkVideoCapturer() = default;
+ClientFrameSinkVideoCapturer::~ClientFrameSinkVideoCapturer() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
 
 void ClientFrameSinkVideoCapturer::SetFormat(media::VideoPixelFormat format,
                                              media::ColorSpace color_space) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   format_.emplace(format, color_space);
   capturer_->SetFormat(format, color_space);
 }
 
 void ClientFrameSinkVideoCapturer::SetMinCapturePeriod(
     base::TimeDelta min_capture_period) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   min_capture_period_ = min_capture_period;
   capturer_->SetMinCapturePeriod(min_capture_period);
 }
 
 void ClientFrameSinkVideoCapturer::SetMinSizeChangePeriod(
     base::TimeDelta min_period) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   min_size_change_period_ = min_period;
   capturer_->SetMinSizeChangePeriod(min_period);
 }
@@ -48,45 +56,81 @@
     const gfx::Size& min_size,
     const gfx::Size& max_size,
     bool use_fixed_aspect_ratio) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   resolution_constraints_.emplace(min_size, max_size, use_fixed_aspect_ratio);
   capturer_->SetResolutionConstraints(min_size, max_size,
                                       use_fixed_aspect_ratio);
 }
 
 void ClientFrameSinkVideoCapturer::SetAutoThrottlingEnabled(bool enabled) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   auto_throttling_enabled_ = enabled;
   capturer_->SetAutoThrottlingEnabled(enabled);
 }
 
 void ClientFrameSinkVideoCapturer::ChangeTarget(
     const base::Optional<FrameSinkId>& frame_sink_id) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   target_ = frame_sink_id;
   capturer_->ChangeTarget(frame_sink_id);
 }
 
 void ClientFrameSinkVideoCapturer::Start(
     mojom::FrameSinkVideoConsumer* consumer) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(consumer);
+
   is_started_ = true;
   consumer_ = consumer;
   StartInternal();
 }
 
 void ClientFrameSinkVideoCapturer::Stop() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   is_started_ = false;
   capturer_->Stop();
 }
 
 void ClientFrameSinkVideoCapturer::StopAndResetConsumer() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   Stop();
   consumer_ = nullptr;
   consumer_binding_.Close();
 }
 
 void ClientFrameSinkVideoCapturer::RequestRefreshFrame() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   capturer_->RequestRefreshFrame();
 }
 
+std::unique_ptr<ClientFrameSinkVideoCapturer::Overlay>
+ClientFrameSinkVideoCapturer::CreateOverlay(int32_t stacking_index) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // If there is an existing overlay at the same index, drop it.
+  auto it = std::find_if(overlays_.begin(), overlays_.end(),
+                         [&stacking_index](const Overlay* overlay) {
+                           return overlay->stacking_index() == stacking_index;
+                         });
+  if (it != overlays_.end()) {
+    (*it)->DisconnectPermanently();
+    overlays_.erase(it);
+  }
+
+  auto overlay =
+      std::make_unique<Overlay>(weak_factory_.GetWeakPtr(), stacking_index);
+  overlays_.push_back(overlay.get());
+  if (capturer_)
+    overlays_.back()->EstablishConnection(capturer_.get());
+  return overlay;
+}
+
 ClientFrameSinkVideoCapturer::Format::Format(
     media::VideoPixelFormat pixel_format,
     media::ColorSpace color_space)
@@ -107,15 +151,21 @@
     const gfx::Rect& update_rect,
     const gfx::Rect& content_rect,
     mojom::FrameSinkVideoConsumerFrameCallbacksPtr callbacks) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   consumer_->OnFrameCaptured(std::move(buffer), buffer_size, std::move(info),
                              update_rect, content_rect, std::move(callbacks));
 }
 
 void ClientFrameSinkVideoCapturer::OnStopped() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   consumer_->OnStopped();
 }
 
 void ClientFrameSinkVideoCapturer::EstablishConnection() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   establish_connection_callback_.Run(mojo::MakeRequest(&capturer_));
   capturer_.set_connection_error_handler(
       base::BindOnce(&ClientFrameSinkVideoCapturer::OnConnectionError,
@@ -135,11 +185,15 @@
     capturer_->SetAutoThrottlingEnabled(*auto_throttling_enabled_);
   if (target_)
     capturer_->ChangeTarget(target_);
+  for (Overlay* overlay : overlays_)
+    overlay->EstablishConnection(capturer_.get());
   if (is_started_)
     StartInternal();
 }
 
 void ClientFrameSinkVideoCapturer::OnConnectionError() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&ClientFrameSinkVideoCapturer::EstablishConnection,
@@ -155,4 +209,73 @@
   capturer_->Start(std::move(consumer));
 }
 
+void ClientFrameSinkVideoCapturer::OnOverlayDestroyed(Overlay* overlay) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  const auto it = std::find(overlays_.begin(), overlays_.end(), overlay);
+  DCHECK(it != overlays_.end());
+  overlays_.erase(it);
+}
+
+ClientFrameSinkVideoCapturer::Overlay::Overlay(
+    base::WeakPtr<ClientFrameSinkVideoCapturer> client_capturer,
+    int32_t stacking_index)
+    : client_capturer_(client_capturer), stacking_index_(stacking_index) {}
+
+ClientFrameSinkVideoCapturer::Overlay::~Overlay() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (client_capturer_)
+    client_capturer_->OnOverlayDestroyed(this);
+}
+
+void ClientFrameSinkVideoCapturer::Overlay::SetImageAndBounds(
+    const SkBitmap& image,
+    const gfx::RectF& bounds) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!image.isNull());
+
+  if (!client_capturer_)
+    return;
+
+  image_ = image;
+  bounds_ = bounds;
+  overlay_->SetImageAndBounds(image_, bounds_);
+}
+
+void ClientFrameSinkVideoCapturer::Overlay::SetBounds(
+    const gfx::RectF& bounds) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (!client_capturer_)
+    return;
+
+  bounds_ = bounds;
+  overlay_->SetBounds(bounds_);
+}
+
+void ClientFrameSinkVideoCapturer::Overlay::DisconnectPermanently() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  client_capturer_.reset();
+  overlay_.reset();
+  image_.reset();
+}
+
+void ClientFrameSinkVideoCapturer::Overlay::EstablishConnection(
+    mojom::FrameSinkVideoCapturer* capturer) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(client_capturer_);
+
+  capturer->CreateOverlay(stacking_index_, mojo::MakeRequest(&overlay_));
+  // Note: There's no need to add a connection error handler on the
+  // InterfacePtr. If the connection to the service is lost, the
+  // ClientFrameSinkVideoCapturer will realize this when the
+  // FrameSinkVideoCapturer's binding is lost, and re-establish a connection to
+  // both that and this overlay.
+
+  if (!image_.isNull())
+    overlay_->SetImageAndBounds(image_, bounds_);
+}
+
 }  // namespace viz
diff --git a/components/viz/host/client_frame_sink_video_capturer.h b/components/viz/host/client_frame_sink_video_capturer.h
index 71ad5a5..bd39a68 100644
--- a/components/viz/host/client_frame_sink_video_capturer.h
+++ b/components/viz/host/client_frame_sink_video_capturer.h
@@ -5,13 +5,18 @@
 #ifndef COMPONENTS_VIZ_HOST_CLIENT_FRAME_SINK_VIDEO_CAPTURER_H_
 #define COMPONENTS_VIZ_HOST_CLIENT_FRAME_SINK_VIDEO_CAPTURER_H_
 
+#include <vector>
+
 #include "base/callback.h"
+#include "base/sequence_checker.h"
 #include "base/time/time.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
 #include "components/viz/host/viz_host_export.h"
 #include "media/base/video_types.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "services/viz/privileged/interfaces/compositing/frame_sink_video_capture.mojom.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace viz {
@@ -28,6 +33,37 @@
 class VIZ_HOST_EXPORT ClientFrameSinkVideoCapturer
     : private mojom::FrameSinkVideoConsumer {
  public:
+  // A re-connectable FrameSinkVideoCaptureOverlay. See CreateOverlay().
+  class Overlay : public mojom::FrameSinkVideoCaptureOverlay {
+   public:
+    Overlay(base::WeakPtr<ClientFrameSinkVideoCapturer> client_capturer,
+            int32_t stacking_index);
+    ~Overlay() final;
+
+    int32_t stacking_index() const { return stacking_index_; }
+
+    // mojom::FrameSinkVideoCaptureOverlay implementation.
+    void SetImageAndBounds(const SkBitmap& image,
+                           const gfx::RectF& bounds) final;
+    void SetBounds(const gfx::RectF& bounds) final;
+
+   private:
+    friend class ClientFrameSinkVideoCapturer;
+    void DisconnectPermanently();
+    void EstablishConnection(mojom::FrameSinkVideoCapturer* capturer);
+
+    SEQUENCE_CHECKER(sequence_checker_);
+
+    base::WeakPtr<ClientFrameSinkVideoCapturer> client_capturer_;
+    const int32_t stacking_index_;
+    mojom::FrameSinkVideoCaptureOverlayPtr overlay_;
+
+    SkBitmap image_;
+    gfx::RectF bounds_;
+
+    DISALLOW_COPY_AND_ASSIGN(Overlay);
+  };
+
   using EstablishConnectionCallback =
       base::RepeatingCallback<void(mojom::FrameSinkVideoCapturerRequest)>;
 
@@ -55,6 +91,10 @@
   // messages (even OnStopped()) will be delivered to the consumer.
   void StopAndResetConsumer();
 
+  // Similar to FrameSinkVideoCapturer::CreateOverlay, except that it returns an
+  // owned pointer to an Overlay.
+  std::unique_ptr<Overlay> CreateOverlay(int32_t stacking_index);
+
  private:
   struct Format {
     Format(media::VideoPixelFormat pixel_format, media::ColorSpace color_space);
@@ -93,6 +133,10 @@
 
   void StartInternal();
 
+  void OnOverlayDestroyed(Overlay* overlay);
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
   // The following variables keep the latest arguments provided to their
   // corresponding method in mojom::FrameSinkVideoCapturer. The arguments are
   // saved so we can resend them if viz crashes and a new FrameSinkVideoCapturer
@@ -103,6 +147,8 @@
   base::Optional<ResolutionConstraints> resolution_constraints_;
   base::Optional<bool> auto_throttling_enabled_;
   base::Optional<FrameSinkId> target_;
+  // Overlays are owned by the callers of CreateOverlay().
+  std::vector<Overlay*> overlays_;
   bool is_started_ = false;
 
   mojom::FrameSinkVideoConsumer* consumer_ = nullptr;
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc
index e3d29aa..129624f 100644
--- a/components/viz/service/display/display_resource_provider.cc
+++ b/components/viz/service/display/display_resource_provider.cc
@@ -257,25 +257,18 @@
 #endif  // OS_ANDROID
 }
 
-int DisplayResourceProvider::CreateChild(
-    const ReturnCallback& return_callback) {
+int DisplayResourceProvider::CreateChild(const ReturnCallback& return_callback,
+                                         bool needs_sync_tokens) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   Child child_info;
   child_info.return_callback = return_callback;
-
+  child_info.needs_sync_tokens = needs_sync_tokens;
   int child = next_child_++;
   children_[child] = child_info;
   return child;
 }
 
-void DisplayResourceProvider::SetChildNeedsSyncTokens(int child_id,
-                                                      bool needs) {
-  auto it = children_.find(child_id);
-  DCHECK(it != children_.end());
-  it->second.needs_sync_tokens = needs;
-}
-
 void DisplayResourceProvider::DestroyChild(int child_id) {
   auto it = children_.find(child_id);
   DCHECK(it != children_.end());
diff --git a/components/viz/service/display/display_resource_provider.h b/components/viz/service/display/display_resource_provider.h
index 5b67fad..1e22a807 100644
--- a/components/viz/service/display/display_resource_provider.h
+++ b/components/viz/service/display/display_resource_provider.h
@@ -241,16 +241,15 @@
     current_read_lock_fence_ = fence;
   }
 
-  // Creates accounting for a child. Returns a child ID.
-  int CreateChild(const ReturnCallback& return_callback);
+  // Creates accounting for a child. Returns a child ID. |needs_sync_tokens|
+  // sets whether resources need sync points set on them when returned to this
+  // child.
+  int CreateChild(const ReturnCallback& return_callback,
+                  bool needs_sync_tokens);
 
   // Destroys accounting for the child, deleting all accounted resources.
   void DestroyChild(int child);
 
-  // Sets whether resources need sync points set on them when returned to this
-  // child. Defaults to true.
-  void SetChildNeedsSyncTokens(int child, bool needs_sync_tokens);
-
   // Gets the child->parent resource ID map.
   const std::unordered_map<ResourceId, ResourceId>& GetChildToParentMap(
       int child) const;
diff --git a/components/viz/service/display/display_resource_provider_unittest.cc b/components/viz/service/display/display_resource_provider_unittest.cc
index 974f95bd..bfbc68ed 100644
--- a/components/viz/service/display/display_resource_provider_unittest.cc
+++ b/components/viz/service/display/display_resource_provider_unittest.cc
@@ -415,7 +415,7 @@
       DisplayResourceProvider* resource_provider) {
     ReturnCallback return_callback = base::DoNothing();
 
-    int child = resource_provider->CreateChild(return_callback);
+    int child = resource_provider->CreateChild(return_callback, true);
 
     gpu::Mailbox gpu_mailbox;
     gpu_mailbox.name[0] = c;
@@ -460,8 +460,8 @@
   ResourceId id1 = child_resource_provider_->ImportResource(
       gl_resource, SingleReleaseCallback::Create(base::DoNothing()));
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
 
   // Transfer some resources to the parent.
   std::vector<TransferableResource> list;
@@ -513,8 +513,8 @@
                 &MockReleaseCallback::Released, base::Unretained(&release))));
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
   {
     // Transfer some resources to the parent.
     std::vector<TransferableResource> list;
@@ -578,8 +578,8 @@
                  &MockReleaseCallback::Released, base::Unretained(&release))));
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
 
   // Transfer some resources to the parent.
   std::vector<TransferableResource> list;
@@ -637,8 +637,8 @@
                  &MockReleaseCallback::Released, base::Unretained(&release))));
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
 
   // Transfer resources to the parent.
   std::vector<TransferableResource> list;
@@ -698,8 +698,8 @@
       tran2, SingleReleaseCallback::Create(base::DoNothing()));
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
 
   // Transfer resources to the parent.
   std::vector<TransferableResource> list;
@@ -764,9 +764,8 @@
       SingleReleaseCallback::Create(base::DoNothing()));
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
-  resource_provider_->SetChildNeedsSyncTokens(child_id, false);
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), false);
   {
     // Transfer some resources to the parent.
     std::vector<TransferableResource> list;
@@ -816,8 +815,8 @@
   MockReleaseCallback release;
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
 
   // Transfer some resources to the parent.
   std::vector<ResourceId> resource_ids_to_transfer;
@@ -882,7 +881,7 @@
 
   std::vector<ReturnedResource> returned_to_child;
   int child_id = resource_provider_->CreateChild(
-      base::BindRepeating(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
 
   // Receive a resource then lose the gpu context.
   resource_provider_->ReceiveFromChild(child_id, {tran});
@@ -920,7 +919,7 @@
   std::vector<TransferableResource> send_to_parent;
   std::vector<ReturnedResource> returned_to_child;
   int child_id = resource_provider_->CreateChild(
-      base::BindRepeating(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
   child_resource_provider_->PrepareSendToParent({resource_id}, &send_to_parent,
                                                 child_context_provider_.get());
   resource_provider_->ReceiveFromChild(child_id, send_to_parent);
@@ -1039,7 +1038,7 @@
     std::vector<TransferableResource> send_to_parent;
     std::vector<ReturnedResource> returned_to_child;
     int child_id = resource_provider->CreateChild(
-        base::BindRepeating(&CollectResources, &returned_to_child));
+        base::BindRepeating(&CollectResources, &returned_to_child), true);
     child_resource_provider->PrepareSendToParent({resource_id}, &send_to_parent,
                                                  child_context_provider.get());
     resource_provider->ReceiveFromChild(child_id, send_to_parent);
@@ -1192,7 +1191,7 @@
   std::vector<TransferableResource> send_to_parent;
   std::vector<ReturnedResource> returned_to_child;
   int child_id = resource_provider->CreateChild(
-      base::BindRepeating(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
   child_resource_provider->PrepareSendToParent({resource_id}, &send_to_parent,
                                                child_context_provider_.get());
   resource_provider->ReceiveFromChild(child_id, send_to_parent);
@@ -1322,8 +1321,8 @@
       id2_transfer, SingleReleaseCallback::Create(base::DoNothing()));
 
   std::vector<ReturnedResource> returned_to_child;
-  int child_id =
-      resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
+  int child_id = resource_provider_->CreateChild(
+      GetReturnCallback(&returned_to_child), true);
 
   // Transfer some resources to the parent.
   std::vector<TransferableResource> list;
diff --git a/components/viz/service/display/gl_renderer_unittest.cc b/components/viz/service/display/gl_renderer_unittest.cc
index 82dc33d..6e2bfc8 100644
--- a/components/viz/service/display/gl_renderer_unittest.cc
+++ b/components/viz/service/display/gl_renderer_unittest.cc
@@ -2229,7 +2229,7 @@
 
   std::vector<ReturnedResource> returned_to_child;
   int child_id = parent_resource_provider->CreateChild(
-      base::Bind(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
 
   // Transfer resource to the parent.
   std::vector<ResourceId> resource_ids_to_transfer;
@@ -2438,7 +2438,7 @@
 
   std::vector<ReturnedResource> returned_to_child;
   int child_id = parent_resource_provider->CreateChild(
-      base::Bind(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
 
   // Transfer resource to the parent.
   std::vector<ResourceId> resource_ids_to_transfer;
@@ -2823,7 +2823,7 @@
 
   std::vector<ReturnedResource> returned_to_child;
   int child_id = parent_resource_provider->CreateChild(
-      base::Bind(&CollectResources, &returned_to_child));
+      base::BindRepeating(&CollectResources, &returned_to_child), true);
 
   // Transfer resource to the parent.
   std::vector<ResourceId> resource_ids_to_transfer;
diff --git a/components/viz/service/display/overlay_unittest.cc b/components/viz/service/display/overlay_unittest.cc
index cb57813..1b200d1 100644
--- a/components/viz/service/display/overlay_unittest.cc
+++ b/components/viz/service/display/overlay_unittest.cc
@@ -295,7 +295,7 @@
       child_resource_provider, size, is_overlay_candidate);
 
   int child_id = parent_resource_provider->CreateChild(
-      base::BindRepeating([](const std::vector<ReturnedResource>&) {}));
+      base::BindRepeating([](const std::vector<ReturnedResource>&) {}), true);
 
   // Transfer resource to the parent.
   std::vector<ResourceId> resource_ids_to_transfer;
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index b7518493..4b20b28f 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -148,8 +148,9 @@
   auto it = surface_id_to_resource_child_id_.find(surface->surface_id());
   if (it == surface_id_to_resource_child_id_.end()) {
     int child_id = provider_->CreateChild(
-        base::Bind(&SurfaceAggregator::UnrefResources, surface->client()));
-    provider_->SetChildNeedsSyncTokens(child_id, surface->needs_sync_tokens());
+        base::BindRepeating(&SurfaceAggregator::UnrefResources,
+                            surface->client()),
+        surface->needs_sync_tokens());
     surface_id_to_resource_child_id_[surface->surface_id()] = child_id;
     return child_id;
   } else {
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/compositor_frame_sink_impl.cc
index 67f27f4..9d5e5883 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_impl.cc
@@ -68,7 +68,7 @@
   const auto result = support_->MaybeSubmitCompositorFrame(
       local_surface_id, std::move(frame), std::move(hit_test_region_list),
       submit_time, std::move(callback));
-  if (result == CompositorFrameSinkSupport::ACCEPTED)
+  if (result == SubmitResult::ACCEPTED)
     return;
 
   const char* reason =
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
index bbdf378b..3704947 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "base/time/time.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
@@ -272,7 +273,9 @@
       local_surface_id, std::move(frame), std::move(hit_test_region_list),
       submit_time,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  DCHECK_EQ(result, ACCEPTED);
+  UMA_HISTOGRAM_ENUMERATION(
+      "Compositing.CompositorFrameSinkSupport.SubmitResult", result);
+  DCHECK_EQ(result, SubmitResult::ACCEPTED);
 }
 
 bool CompositorFrameSinkSupport::DidAllocateSharedBitmap(
@@ -292,8 +295,7 @@
   owned_bitmaps_.erase(id);
 }
 
-CompositorFrameSinkSupport::SubmitResult
-CompositorFrameSinkSupport::MaybeSubmitCompositorFrame(
+SubmitResult CompositorFrameSinkSupport::MaybeSubmitCompositorFrame(
     const LocalSurfaceId& local_surface_id,
     CompositorFrame frame,
     base::Optional<HitTestRegionList> hit_test_region_list,
@@ -348,7 +350,7 @@
   if (!allow_copy_output_requests_ && frame.HasCopyOutputRequests()) {
     TRACE_EVENT_INSTANT0("viz", "CopyOutputRequests not allowed",
                          TRACE_EVENT_SCOPE_THREAD);
-    return COPY_OUTPUT_REQUESTS_NOT_ALLOWED;
+    return SubmitResult::COPY_OUTPUT_REQUESTS_NOT_ALLOWED;
   }
 
   // TODO(crbug.com/846739): It should be possible to use
@@ -408,7 +410,7 @@
     if (!surface_info.is_valid() || !monotonically_increasing_id) {
       TRACE_EVENT_INSTANT0("viz", "Surface Invariants Violation",
                            TRACE_EVENT_SCOPE_THREAD);
-      return SURFACE_INVARIANTS_VIOLATION;
+      return SubmitResult::SURFACE_INVARIANTS_VIOLATION;
     }
 
     current_surface = CreateSurface(surface_info);
@@ -431,13 +433,13 @@
           : Surface::PresentedCallback());
   if (!result) {
     TRACE_EVENT_INSTANT0("viz", "QueueFrame failed", TRACE_EVENT_SCOPE_THREAD);
-    return SURFACE_INVARIANTS_VIOLATION;
+    return SubmitResult::SURFACE_INVARIANTS_VIOLATION;
   }
 
   if (begin_frame_source_)
     begin_frame_source_->DidFinishFrame(this);
 
-  return ACCEPTED;
+  return SubmitResult::ACCEPTED;
 }
 
 SurfaceReference CompositorFrameSinkSupport::MakeTopLevelRootReference(
@@ -634,11 +636,11 @@
 const char* CompositorFrameSinkSupport::GetSubmitResultAsString(
     SubmitResult result) {
   switch (result) {
-    case CompositorFrameSinkSupport::ACCEPTED:
+    case SubmitResult::ACCEPTED:
       return "Accepted";
-    case CompositorFrameSinkSupport::COPY_OUTPUT_REQUESTS_NOT_ALLOWED:
+    case SubmitResult::COPY_OUTPUT_REQUESTS_NOT_ALLOWED:
       return "CopyOutputRequests not allowed";
-    case CompositorFrameSinkSupport::SURFACE_INVARIANTS_VIOLATION:
+    case SubmitResult::SURFACE_INVARIANTS_VIOLATION:
       return "Surface invariants violation";
   }
   NOTREACHED();
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.h b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
index 4863796..a85f0835 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.h
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
@@ -33,19 +33,23 @@
 class Surface;
 class SurfaceManager;
 
+// Possible outcomes of MaybeSubmitCompositorFrame().
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class SubmitResult {
+  ACCEPTED = 0,
+  COPY_OUTPUT_REQUESTS_NOT_ALLOWED = 1,
+  SURFACE_INVARIANTS_VIOLATION = 2,
+  // Magic constant used by the histogram macros.
+  kMaxValue = SURFACE_INVARIANTS_VIOLATION,
+};
+
 class VIZ_SERVICE_EXPORT CompositorFrameSinkSupport
     : public BeginFrameObserver,
       public SurfaceResourceHolderClient,
       public SurfaceClient,
       public CapturableFrameSink {
  public:
-  // Possible outcomes of MaybeSubmitCompositorFrame().
-  enum SubmitResult {
-    ACCEPTED,
-    COPY_OUTPUT_REQUESTS_NOT_ALLOWED,
-    SURFACE_INVARIANTS_VIOLATION,
-  };
-
   using AggregatedDamageCallback =
       base::RepeatingCallback<void(const LocalSurfaceId& local_surface_id,
                                    const gfx::Size& frame_size_in_pixels,
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
index d4609d1..a0d62a0 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
@@ -134,9 +134,9 @@
         local_surface_id_, std::move(frame), base::nullopt, 0,
         mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
     switch (result) {
-      case CompositorFrameSinkSupport::ACCEPTED:
+      case SubmitResult::ACCEPTED:
         return true;
-      case CompositorFrameSinkSupport::COPY_OUTPUT_REQUESTS_NOT_ALLOWED:
+      case SubmitResult::COPY_OUTPUT_REQUESTS_NOT_ALLOWED:
         return false;
       default:
         ADD_FAILURE()
@@ -557,27 +557,27 @@
   auto result = support->MaybeSubmitCompositorFrame(
       local_surface_id1, MakeDefaultCompositorFrame(), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::ACCEPTED, result);
+  EXPECT_EQ(SubmitResult::ACCEPTED, result);
   result = support->MaybeSubmitCompositorFrame(
       local_surface_id2, MakeDefaultCompositorFrame(), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::ACCEPTED, result);
+  EXPECT_EQ(SubmitResult::ACCEPTED, result);
   result = support->MaybeSubmitCompositorFrame(
       local_surface_id3, MakeDefaultCompositorFrame(), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::ACCEPTED, result);
+  EXPECT_EQ(SubmitResult::ACCEPTED, result);
   result = support->MaybeSubmitCompositorFrame(
       local_surface_id4, MakeDefaultCompositorFrame(), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::SURFACE_INVARIANTS_VIOLATION, result);
+  EXPECT_EQ(SubmitResult::SURFACE_INVARIANTS_VIOLATION, result);
   result = support->MaybeSubmitCompositorFrame(
       local_surface_id5, MakeDefaultCompositorFrame(), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::SURFACE_INVARIANTS_VIOLATION, result);
+  EXPECT_EQ(SubmitResult::SURFACE_INVARIANTS_VIOLATION, result);
   result = support->MaybeSubmitCompositorFrame(
       local_surface_id6, MakeDefaultCompositorFrame(), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::ACCEPTED, result);
+  EXPECT_EQ(SubmitResult::ACCEPTED, result);
 
   manager_.InvalidateFrameSinkId(kAnotherArbitraryFrameSinkId);
 }
@@ -809,7 +809,7 @@
   const auto result = support_->MaybeSubmitCompositorFrame(
       local_surface_id_, std::move(frame), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::SURFACE_INVARIANTS_VIOLATION, result);
+  EXPECT_EQ(SubmitResult::SURFACE_INVARIANTS_VIOLATION, result);
   EXPECT_FALSE(GetSurfaceForId(id));
 }
 
@@ -825,7 +825,7 @@
   auto result = support_->MaybeSubmitCompositorFrame(
       local_surface_id_, std::move(frame), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::ACCEPTED, result);
+  EXPECT_EQ(SubmitResult::ACCEPTED, result);
   EXPECT_TRUE(GetSurfaceForId(id));
 
   // Submit a frame with size (5,4). This frame should be rejected and the
@@ -841,7 +841,7 @@
       local_surface_id_, std::move(frame), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
 
-  EXPECT_EQ(CompositorFrameSinkSupport::SURFACE_INVARIANTS_VIOLATION, result);
+  EXPECT_EQ(SubmitResult::SURFACE_INVARIANTS_VIOLATION, result);
 
   // All the resources in the rejected frame should have been returned.
   CheckReturnedResourcesMatchExpected(frame_resource_ids,
@@ -862,7 +862,7 @@
   auto result = support_->MaybeSubmitCompositorFrame(
       local_surface_id_, std::move(frame), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::ACCEPTED, result);
+  EXPECT_EQ(SubmitResult::ACCEPTED, result);
   EXPECT_TRUE(GetSurfaceForId(id));
 
   // Submit a frame with device scale factor of 0.4. This frame should be
@@ -874,7 +874,7 @@
   result = support_->MaybeSubmitCompositorFrame(
       local_surface_id_, std::move(frame), base::nullopt, 0,
       mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback());
-  EXPECT_EQ(CompositorFrameSinkSupport::SURFACE_INVARIANTS_VIOLATION, result);
+  EXPECT_EQ(SubmitResult::SURFACE_INVARIANTS_VIOLATION, result);
 }
 
 TEST_F(CompositorFrameSinkSupportTest, PassesOnBeginFrameAcks) {
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
index b5a0d47b..5777dddb 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -155,7 +155,7 @@
   const auto result = support_->MaybeSubmitCompositorFrame(
       local_surface_id, std::move(frame), std::move(hit_test_region_list),
       submit_time, SubmitCompositorFrameSyncCallback());
-  if (result == CompositorFrameSinkSupport::ACCEPTED)
+  if (result == SubmitResult::ACCEPTED)
     return;
 
   const char* reason =
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
index 92ac07e..c0cb4de0 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
@@ -255,6 +255,17 @@
   }
 }
 
+void FrameSinkVideoCapturerImpl::CreateOverlay(
+    int32_t stacking_index,
+    mojom::FrameSinkVideoCaptureOverlayRequest request) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // This will cause an existing overlay with the same stacking index to be
+  // dropped, per mojom-documented behavior.
+  overlays_.emplace(stacking_index, std::make_unique<VideoCaptureOverlay>(
+                                        this, std::move(request)));
+}
+
 void FrameSinkVideoCapturerImpl::ScheduleRefreshFrame() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -327,7 +338,7 @@
   DCHECK(resolved_target_);
 
   if (frame_size == oracle_.source_size()) {
-    dirty_rect_.Union(damage_rect);
+    InvalidateRect(damage_rect);
   } else {
     oracle_.SetSourceSize(frame_size);
     dirty_rect_ = kMaxRect;
@@ -337,6 +348,45 @@
                     expected_display_time, frame_metadata);
 }
 
+gfx::Size FrameSinkVideoCapturerImpl::GetSourceSize() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  return oracle_.source_size();
+}
+
+void FrameSinkVideoCapturerImpl::InvalidateRect(const gfx::Rect& rect) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  gfx::Rect positive_rect = rect;
+  positive_rect.Intersect(kMaxRect);
+  dirty_rect_.Union(positive_rect);
+}
+
+void FrameSinkVideoCapturerImpl::OnOverlayConnectionLost(
+    VideoCaptureOverlay* overlay) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  const auto it =
+      std::find_if(overlays_.begin(), overlays_.end(),
+                   [&overlay](const decltype(overlays_)::value_type& entry) {
+                     return entry.second.get() == overlay;
+                   });
+  DCHECK(it != overlays_.end());
+  overlays_.erase(it);
+}
+
+std::vector<VideoCaptureOverlay*>
+FrameSinkVideoCapturerImpl::GetOverlaysInOrder() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  std::vector<VideoCaptureOverlay*> list;
+  list.reserve(overlays_.size());
+  for (const auto& entry : overlays_) {
+    list.push_back(entry.second.get());
+  }
+  return list;
+}
+
 void FrameSinkVideoCapturerImpl::MaybeCaptureFrame(
     VideoCaptureOracle::Event event,
     const gfx::Rect& damage_rect,
@@ -497,7 +547,11 @@
           : CopyOutputRequest::ResultFormat::RGBA_BITMAP,
       base::BindOnce(&FrameSinkVideoCapturerImpl::DidCopyFrame,
                      capture_weak_factory_.GetWeakPtr(), frame_number,
-                     oracle_frame_number, content_rect, std::move(frame))));
+                     oracle_frame_number, content_rect,
+                     VideoCaptureOverlay::MakeCombinedRenderer(
+                         GetOverlaysInOrder(), content_rect, frame->format(),
+                         frame->ColorSpace()),
+                     std::move(frame))));
   request->set_source(copy_request_source_);
   request->set_area(gfx::Rect(source_size));
   request->SetScaleRatio(
@@ -515,6 +569,7 @@
     int64_t frame_number,
     OracleFrameNumber oracle_frame_number,
     const gfx::Rect& content_rect,
+    VideoCaptureOverlay::OnceRenderer overlay_renderer,
     scoped_refptr<VideoFrame> frame,
     std::unique_ptr<CopyOutputResult> result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -543,17 +598,7 @@
     uint8_t* const v = frame->visible_data(VideoFrame::kVPlane) +
                        (content_rect.y() / 2) * v_stride +
                        (content_rect.x() / 2);
-    if (result->ReadI420Planes(y, y_stride, u, u_stride, v, v_stride)) {
-      // The result may be smaller than what was requested, if unforeseen
-      // clamping to the source boundaries occurred by the executor of the
-      // CopyOutputRequest. However, the result should never contain more than
-      // what was requested.
-      DCHECK_LE(result->size().width(), content_rect.width());
-      DCHECK_LE(result->size().height(), content_rect.height());
-      media::LetterboxVideoFrame(
-          frame.get(), gfx::Rect(content_rect.origin(),
-                                 AdjustSizeForPixelFormat(result->size())));
-    } else {
+    if (!result->ReadI420Planes(y, y_stride, u, u_stride, v, v_stride)) {
       frame = nullptr;
     }
   } else {
@@ -561,15 +606,27 @@
     DCHECK_EQ(media::PIXEL_FORMAT_ARGB, pixel_format_);
     uint8_t* const pixels = frame->visible_data(VideoFrame::kARGBPlane) +
                             content_rect.y() * stride + content_rect.x() * 4;
-    if (result->ReadRGBAPlane(pixels, stride)) {
-      media::LetterboxVideoFrame(
-          frame.get(), gfx::Rect(content_rect.origin(),
-                                 AdjustSizeForPixelFormat(result->size())));
-    } else {
+    if (!result->ReadRGBAPlane(pixels, stride)) {
       frame = nullptr;
     }
   }
 
+  if (frame) {
+    if (overlay_renderer) {
+      std::move(overlay_renderer).Run(frame.get());
+    }
+
+    // The result may be smaller than what was requested, if unforeseen
+    // clamping to the source boundaries occurred by the executor of the
+    // CopyOutputRequest. However, the result should never contain more than
+    // what was requested.
+    DCHECK_LE(result->size().width(), content_rect.width());
+    DCHECK_LE(result->size().height(), content_rect.height());
+    media::LetterboxVideoFrame(
+        frame.get(), gfx::Rect(content_rect.origin(),
+                               AdjustSizeForPixelFormat(result->size())));
+  }
+
   DidCaptureFrame(frame_number, oracle_frame_number, content_rect,
                   std::move(frame));
 }
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h
index 09f9eb02..ebbf0e3 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h
@@ -9,7 +9,9 @@
 
 #include <memory>
 #include <queue>
+#include <vector>
 
+#include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
@@ -23,6 +25,7 @@
 #include "components/viz/service/frame_sinks/video_capture/capturable_frame_sink.h"
 #include "components/viz/service/frame_sinks/video_capture/in_flight_frame_delivery.h"
 #include "components/viz/service/frame_sinks/video_capture/interprocess_frame_pool.h"
+#include "components/viz/service/frame_sinks/video_capture/video_capture_overlay.h"
 #include "components/viz/service/viz_service_export.h"
 #include "media/base/video_frame.h"
 #include "media/capture/content/video_capture_oracle.h"
@@ -64,6 +67,7 @@
 // memory for efficient transport to the consumer.
 class VIZ_SERVICE_EXPORT FrameSinkVideoCapturerImpl final
     : public CapturableFrameSink::Client,
+      public VideoCaptureOverlay::FrameSource,
       public mojom::FrameSinkVideoCapturer {
  public:
   // |frame_sink_manager| must outlive this instance. Binds this instance to the
@@ -104,6 +108,8 @@
   void Start(mojom::FrameSinkVideoConsumerPtr consumer) final;
   void Stop() final;
   void RequestRefreshFrame() final;
+  void CreateOverlay(int32_t stacking_index,
+                     mojom::FrameSinkVideoCaptureOverlayRequest request) final;
 
   // Default configuration.
   static constexpr media::VideoPixelFormat kDefaultPixelFormat =
@@ -162,6 +168,14 @@
                       base::TimeTicks target_display_time,
                       const CompositorFrameMetadata& frame_metadata) final;
 
+  // VideoCaptureOverlay::FrameSource implementation:
+  gfx::Size GetSourceSize() final;
+  void InvalidateRect(const gfx::Rect& rect) final;
+  void OnOverlayConnectionLost(VideoCaptureOverlay* overlay) final;
+
+  // Returns a list of the overlays in rendering order.
+  std::vector<VideoCaptureOverlay*> GetOverlaysInOrder() const;
+
   // Consults the VideoCaptureOracle to decide whether to capture a frame,
   // then ensures prerequisites are met before initiating the capture: that
   // there is a consumer present and that the pipeline is not already full.
@@ -175,6 +189,7 @@
   void DidCopyFrame(int64_t frame_number,
                     OracleFrameNumber oracle_frame_number,
                     const gfx::Rect& content_rect,
+                    VideoCaptureOverlay::OnceRenderer overlay_renderer,
                     scoped_refptr<media::VideoFrame> frame,
                     std::unique_ptr<CopyOutputResult> result);
 
@@ -278,6 +293,12 @@
   // compute the relative media stream timestamps for each successive frame.
   base::Optional<base::TimeTicks> first_frame_media_ticks_;
 
+  // Zero or more overlays to be rendered over each captured video frame. The
+  // order of the entries in this map determines the order in which each overlay
+  // is rendered. This is important because alpha blending between overlays can
+  // make a difference in the overall results.
+  base::flat_map<int32_t, std::unique_ptr<VideoCaptureOverlay>> overlays_;
+
   // This class assumes its control operations and async callbacks won't execute
   // simultaneously.
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc b/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc
index 75be2cb..491ea90 100644
--- a/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc
+++ b/components/viz/service/frame_sinks/video_capture/video_capture_overlay.cc
@@ -26,9 +26,14 @@
 
 VideoCaptureOverlay::FrameSource::~FrameSource() = default;
 
-VideoCaptureOverlay::VideoCaptureOverlay(FrameSource* frame_source)
-    : frame_source_(frame_source) {
+VideoCaptureOverlay::VideoCaptureOverlay(
+    FrameSource* frame_source,
+    mojom::FrameSinkVideoCaptureOverlayRequest request)
+    : frame_source_(frame_source), binding_(this, std::move(request)) {
   DCHECK(frame_source_);
+  binding_.set_connection_error_handler(
+      base::BindOnce(&FrameSource::OnOverlayConnectionLost,
+                     base::Unretained(frame_source_), this));
 }
 
 VideoCaptureOverlay::~VideoCaptureOverlay() = default;
@@ -160,7 +165,7 @@
 
 // static
 VideoCaptureOverlay::OnceRenderer VideoCaptureOverlay::MakeCombinedRenderer(
-    const std::vector<std::unique_ptr<VideoCaptureOverlay>>& overlays,
+    const std::vector<VideoCaptureOverlay*>& overlays,
     const gfx::Rect& region_in_frame,
     const VideoPixelFormat frame_format,
     const gfx::ColorSpace& frame_color_space) {
@@ -169,7 +174,7 @@
   }
 
   std::vector<OnceRenderer> renderers;
-  for (const std::unique_ptr<VideoCaptureOverlay>& overlay : overlays) {
+  for (VideoCaptureOverlay* overlay : overlays) {
     renderers.emplace_back(overlay->MakeRenderer(region_in_frame, frame_format,
                                                  frame_color_space));
     if (renderers.back().is_null()) {
diff --git a/components/viz/service/frame_sinks/video_capture/video_capture_overlay.h b/components/viz/service/frame_sinks/video_capture/video_capture_overlay.h
index 1d39a15..52deaec 100644
--- a/components/viz/service/frame_sinks/video_capture/video_capture_overlay.h
+++ b/components/viz/service/frame_sinks/video_capture/video_capture_overlay.h
@@ -16,6 +16,8 @@
 #include "base/sequence_checker.h"
 #include "components/viz/service/viz_service_export.h"
 #include "media/base/video_types.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/viz/privileged/interfaces/compositing/frame_sink_video_capture.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/color_transform.h"
@@ -44,10 +46,8 @@
 //
 // The blit algorithm uses naive linear blending. Thus, the use of non-linear
 // color spaces will cause loses in color accuracy.
-//
-// TODO(crbug.com/810133): Override the mojom::FrameSinkVideoCaptureOverlay
-// interface.
-class VIZ_SERVICE_EXPORT VideoCaptureOverlay {
+class VIZ_SERVICE_EXPORT VideoCaptureOverlay
+    : public mojom::FrameSinkVideoCaptureOverlay {
  public:
   // Interface for notifying the frame source when changes to the overlay's
   // state occur.
@@ -66,6 +66,10 @@
     // image and/or position.
     virtual void RequestRefreshFrame() = 0;
 
+    // Notifies the FrameSource that the VideoCaptureOverlay has lost its mojo
+    // binding.
+    virtual void OnOverlayConnectionLost(VideoCaptureOverlay* overlay) = 0;
+
    protected:
     virtual ~FrameSource();
   };
@@ -74,18 +78,14 @@
   using OnceRenderer = base::OnceCallback<void(media::VideoFrame*)>;
 
   // |frame_source| must outlive this instance.
-  explicit VideoCaptureOverlay(FrameSource* frame_source);
+  VideoCaptureOverlay(FrameSource* frame_source,
+                      mojom::FrameSinkVideoCaptureOverlayRequest request);
 
-  ~VideoCaptureOverlay();
+  ~VideoCaptureOverlay() final;
 
-  // Sets/Changes the overlay |image| and its position and size, relative to the
-  // source content. |bounds| consists of coordinates where the range [0.0,1.0)
-  // indicates the relative position+size within the bounds of the source
-  // content (e.g., 0.0 refers to the top or left edge; 1.0 to just after the
-  // bottom or right edge). Pass empty |bounds| to temporarily hide the overlay
-  // until a later call to SetBounds().
-  void SetImageAndBounds(const SkBitmap& image, const gfx::RectF& bounds);
-  void SetBounds(const gfx::RectF& bounds);
+  // mojom::FrameSinkVideoCaptureOverlay implementation:
+  void SetImageAndBounds(const SkBitmap& image, const gfx::RectF& bounds) final;
+  void SetBounds(const gfx::RectF& bounds) final;
 
   // Returns a OnceCallback that, when run, renders this VideoCaptureOverlay on
   // a VideoFrame. The overlay's position and size are computed based on the
@@ -102,7 +102,7 @@
   // deal with collections of callbacks. Returns a null OnceCallback if there is
   // nothing to render at this time.
   static OnceRenderer MakeCombinedRenderer(
-      const std::vector<std::unique_ptr<VideoCaptureOverlay>>& overlays,
+      const std::vector<VideoCaptureOverlay*>& overlays,
       const gfx::Rect& region_in_frame,
       const media::VideoPixelFormat frame_format,
       const gfx::ColorSpace& frame_color_space);
@@ -165,6 +165,8 @@
 
   FrameSource* const frame_source_;
 
+  mojo::Binding<mojom::FrameSinkVideoCaptureOverlay> binding_;
+
   // The currently-set overlay image.
   SkBitmap image_;
 
diff --git a/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc b/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc
index 2bb5112..4dfc938 100644
--- a/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc
+++ b/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc
@@ -52,6 +52,7 @@
   MOCK_METHOD0(GetSourceSize, gfx::Size());
   MOCK_METHOD1(InvalidateRect, void(const gfx::Rect& rect));
   MOCK_METHOD0(RequestRefreshFrame, void());
+  MOCK_METHOD1(OnOverlayConnectionLost, void(VideoCaptureOverlay* overlay));
 };
 
 class VideoCaptureOverlayTest : public testing::Test {
@@ -61,7 +62,8 @@
   NiceMock<MockFrameSource>* frame_source() { return &frame_source_; }
 
   std::unique_ptr<VideoCaptureOverlay> CreateOverlay() {
-    return std::make_unique<VideoCaptureOverlay>(frame_source());
+    return std::make_unique<VideoCaptureOverlay>(
+        frame_source(), mojom::FrameSinkVideoCaptureOverlayRequest());
   }
 
   void RunUntilIdle() { base::RunLoop().RunUntilIdle(); }
@@ -124,6 +126,19 @@
   DISALLOW_COPY_AND_ASSIGN(VideoCaptureOverlayTest);
 };
 
+// Tests that, when the VideoCaptureOverlay binds to a mojo request, it reports
+// when the binding is closed.
+TEST_F(VideoCaptureOverlayTest, ReportsLostMojoConnection) {
+  mojom::FrameSinkVideoCaptureOverlayPtr overlay_ptr;
+  VideoCaptureOverlay overlay(frame_source(), mojo::MakeRequest(&overlay_ptr));
+  ASSERT_TRUE(overlay_ptr);
+  RunUntilIdle();  // Propagate mojo tasks.
+
+  EXPECT_CALL(*frame_source(), OnOverlayConnectionLost(&overlay));
+  overlay_ptr.reset();
+  RunUntilIdle();  // Propagate mojo tasks.
+}
+
 // Tests that MakeRenderer() does not make a OnceRenderer until the client has
 // set the image.
 TEST_F(VideoCaptureOverlayTest, DoesNotRenderWithoutImage) {
@@ -176,9 +191,10 @@
        DoesNotDoCombinedRenderIfNoOverlaysWouldRender) {
   constexpr gfx::Size kSize = gfx::Size(100, 75);
   EXPECT_CALL(*frame_source(), GetSourceSize()).WillRepeatedly(Return(kSize));
-  std::vector<std::unique_ptr<VideoCaptureOverlay>> overlays;
-  overlays.emplace_back(CreateOverlay());
-  overlays.emplace_back(CreateOverlay());
+  const std::unique_ptr<VideoCaptureOverlay> overlay0 = CreateOverlay();
+  const std::unique_ptr<VideoCaptureOverlay> overlay1 = CreateOverlay();
+  const std::vector<VideoCaptureOverlay*> overlays{overlay0.get(),
+                                                   overlay1.get()};
 
   // Neither overlay has an image yet, so the combined renderer should be null.
   constexpr gfx::Rect kRegionInFrame = gfx::Rect(kSize);
@@ -390,7 +406,8 @@
 // not scaled.
 TEST_P(VideoCaptureOverlayRenderTest, FullCover_NoScaling) {
   StrictMock<MockFrameSource> frame_source;
-  VideoCaptureOverlay overlay(&frame_source);
+  VideoCaptureOverlay overlay(&frame_source,
+                              mojom::FrameSinkVideoCaptureOverlayRequest());
 
   EXPECT_CALL(frame_source, GetSourceSize())
       .WillRepeatedly(Return(kSourceSize));
@@ -414,7 +431,8 @@
 // scaled.
 TEST_P(VideoCaptureOverlayRenderTest, FullCover_WithScaling) {
   StrictMock<MockFrameSource> frame_source;
-  VideoCaptureOverlay overlay(&frame_source);
+  VideoCaptureOverlay overlay(&frame_source,
+                              mojom::FrameSinkVideoCaptureOverlayRequest());
 
   EXPECT_CALL(frame_source, GetSourceSize())
       .WillRepeatedly(Return(kSourceSize));
@@ -441,7 +459,8 @@
   NiceMock<MockFrameSource> frame_source;
   EXPECT_CALL(frame_source, GetSourceSize())
       .WillRepeatedly(Return(kSourceSize));
-  VideoCaptureOverlay overlay(&frame_source);
+  VideoCaptureOverlay overlay(&frame_source,
+                              mojom::FrameSinkVideoCaptureOverlayRequest());
 
   const SkBitmap test_bitmap = MakeTestBitmap(0);
   const gfx::Size frame_size(test_bitmap.width() * 4, test_bitmap.height() * 4);
@@ -506,7 +525,8 @@
   NiceMock<MockFrameSource> frame_source;
   EXPECT_CALL(frame_source, GetSourceSize())
       .WillRepeatedly(Return(kSourceSize));
-  VideoCaptureOverlay overlay(&frame_source);
+  VideoCaptureOverlay overlay(&frame_source,
+                              mojom::FrameSinkVideoCaptureOverlayRequest());
 
   const SkBitmap test_bitmap = MakeTestBitmap(0);
   const gfx::Size frame_size(test_bitmap.width() * 4, test_bitmap.height() * 4);
diff --git a/content/browser/devtools/devtools_video_consumer_unittest.cc b/content/browser/devtools/devtools_video_consumer_unittest.cc
index 826ab906..5b00f7f 100644
--- a/content/browser/devtools/devtools_video_consumer_unittest.cc
+++ b/content/browser/devtools/devtools_video_consumer_unittest.cc
@@ -91,6 +91,9 @@
   }
   MOCK_METHOD0(MockStop, void());
   MOCK_METHOD0(RequestRefreshFrame, void());
+  MOCK_METHOD2(CreateOverlay,
+               void(int32_t stacking_index,
+                    viz::mojom::FrameSinkVideoCaptureOverlayRequest request));
 
   // Const accessors to get the cached variables.
   base::TimeDelta min_capture_period() const { return min_capture_period_; }
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index b97d550..34be9b1 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1233,6 +1233,7 @@
   // The renderer process is gone, so this frame can no longer be loading.
   if (GetNavigationHandle())
     GetNavigationHandle()->set_net_error_code(net::ERR_ABORTED);
+  ResetNavigationRequests();
   ResetLoadingState();
 
   // Any future UpdateState or UpdateTitle messages from this or a recreated
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index bc78898..6d83be4 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -1158,6 +1158,9 @@
   int process_crash_exit_code = exit_code;
   base::debug::Alias(&process_crash_exit_code);
 
+  // Record crash before doing anything that could start a new GPU process.
+  RecordProcessCrash();
+
   // If the GPU process crashed while compiling a shader, we may have invalid
   // cached binaries. Completely clear the shader cache to force shader binaries
   // to be re-created.
@@ -1173,7 +1176,6 @@
     }
   }
   SendOutstandingReplies(EstablishChannelStatus::GPU_HOST_INVALID);
-  RecordProcessCrash();
 
   ChildProcessTerminationInfo info =
       process_->GetTerminationInfo(true /* known_dead */);
@@ -1211,7 +1213,8 @@
   UMA_HISTOGRAM_BOOLEAN("GPU.GPUProcessInitialized", false);
   status_ = FAILURE;
   GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance();
-  gpu_data_manager->FallBackToNextGpuMode();
+  if (kind_ == GPU_PROCESS_KIND_SANDBOXED)
+    gpu_data_manager->FallBackToNextGpuMode();
   RunRequestGPUInfoCallbacks(gpu_data_manager->GetGPUInfo());
 }
 
diff --git a/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc b/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc
index d8de88d..51982c2c 100644
--- a/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc
+++ b/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc
@@ -110,6 +110,9 @@
   }
   MOCK_METHOD0(MockStop, void());
   MOCK_METHOD0(RequestRefreshFrame, void());
+  MOCK_METHOD2(CreateOverlay,
+               void(int32_t stacking_index,
+                    viz::mojom::FrameSinkVideoCaptureOverlayRequest request));
 
  private:
   mojo::Binding<viz::mojom::FrameSinkVideoCapturer> binding_;
diff --git a/content/browser/media/capture/lame_window_capturer_chromeos.cc b/content/browser/media/capture/lame_window_capturer_chromeos.cc
index 1086b27..999b6d9 100644
--- a/content/browser/media/capture/lame_window_capturer_chromeos.cc
+++ b/content/browser/media/capture/lame_window_capturer_chromeos.cc
@@ -140,6 +140,13 @@
   // continuously.
 }
 
+void LameWindowCapturerChromeOS::CreateOverlay(
+    int32_t stacking_index,
+    viz::mojom::FrameSinkVideoCaptureOverlayRequest request) {
+  // TODO(crbug.com/810133): Provide an implementation.
+  NOTIMPLEMENTED();
+}
+
 class LameWindowCapturerChromeOS::InFlightFrame
     : public viz::mojom::FrameSinkVideoConsumerFrameCallbacks {
  public:
diff --git a/content/browser/media/capture/lame_window_capturer_chromeos.h b/content/browser/media/capture/lame_window_capturer_chromeos.h
index 2a467ecc..9c4c42d0 100644
--- a/content/browser/media/capture/lame_window_capturer_chromeos.h
+++ b/content/browser/media/capture/lame_window_capturer_chromeos.h
@@ -66,6 +66,9 @@
   void Start(viz::mojom::FrameSinkVideoConsumerPtr consumer) final;
   void Stop() final;
   void RequestRefreshFrame() final;
+  void CreateOverlay(
+      int32_t stacking_index,
+      viz::mojom::FrameSinkVideoCaptureOverlayRequest request) final;
 
  private:
   // Represents an in-flight frame, being populated by this capturer and then
diff --git a/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc b/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc
index c4987dd..5a05b17 100644
--- a/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc
+++ b/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc
@@ -139,7 +139,7 @@
 
  private:
   gfx::Size GetAbsoluteViewSize() const {
-    const gfx::Size& view_size =
+    const gfx::Size view_size =
         shell()->web_contents()->GetContainerBounds().size();
     CHECK(!view_size.IsEmpty());
     return view_size;
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac.h b/content/browser/renderer_host/input/web_input_event_builders_mac.h
index 99f0d86..d5755a7 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_mac.h
+++ b/content/browser/renderer_host/input/web_input_event_builders_mac.h
@@ -10,7 +10,6 @@
 #include "third_party/blink/public/platform/web_input_event.h"
 #include "third_party/blink/public/platform/web_keyboard_event.h"
 #include "third_party/blink/public/platform/web_mouse_wheel_event.h"
-#include "third_party/blink/public/platform/web_touch_event.h"
 
 @class NSEvent;
 @class NSView;
@@ -42,11 +41,6 @@
   static blink::WebGestureEvent Build(NSEvent*, NSView*);
 };
 
-class CONTENT_EXPORT WebTouchEventBuilder {
- public:
-  static blink::WebTouchEvent Build(NSEvent* event, NSView* view);
-};
-
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_WEB_INPUT_EVENT_BUILDERS_MAC_H_
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac.mm b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
index cb73466..be7624b 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_mac.mm
+++ b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
@@ -571,72 +571,4 @@
   return result;
 }
 
-// WebTouchEvent --------------------------------------------------------------
-
-blink::WebTouchEvent WebTouchEventBuilder::Build(NSEvent* event, NSView* view) {
-  blink::WebInputEvent::Type event_type =
-      blink::WebInputEvent::Type::kUndefined;
-  NSEventType type = [event type];
-  blink::WebTouchPoint::State state = blink::WebTouchPoint::kStateUndefined;
-  switch (type) {
-    case NSLeftMouseDown:
-      event_type = blink::WebInputEvent::kTouchStart;
-      state = blink::WebTouchPoint::kStatePressed;
-      break;
-    case NSLeftMouseUp:
-      event_type = blink::WebInputEvent::kTouchEnd;
-      state = blink::WebTouchPoint::kStateReleased;
-      break;
-    case NSLeftMouseDragged:
-    case NSRightMouseDragged:
-    case NSOtherMouseDragged:
-    case NSMouseMoved:
-    case NSRightMouseDown:
-    case NSOtherMouseDown:
-    case NSRightMouseUp:
-    case NSOtherMouseUp:
-      event_type = blink::WebInputEvent::kTouchMove;
-      state = blink::WebTouchPoint::kStateMoved;
-      break;
-    default:
-      NOTREACHED() << "Invalid types for touch events." << type;
-  }
-
-  blink::WebTouchEvent result(event_type, ModifiersFromEvent(event),
-                              ui::EventTimeStampFromSeconds([event timestamp]));
-  result.hovering = event_type == blink::WebInputEvent::kTouchEnd;
-  result.unique_touch_event_id = ui::GetNextTouchEventId();
-  result.touches_length = 1;
-
-  // Use a temporary WebMouseEvent to get the location.
-  blink::WebMouseEvent temp;
-  SetWebEventLocationFromEventInView(&temp, event, view);
-  result.touches[0].SetPositionInWidget(temp.PositionInWidget());
-  result.touches[0].SetPositionInScreen(temp.PositionInScreen());
-  result.touches[0].movement_x = temp.movement_x;
-  result.touches[0].movement_y = temp.movement_y;
-
-  result.touches[0].state = state;
-  result.touches[0].pointer_type =
-      blink::WebPointerProperties::PointerType::kPen;
-  result.touches[0].id = [event pointingDeviceID];
-  result.touches[0].force = [event pressure];
-  NSPoint tilt = [event tilt];
-  result.touches[0].tilt_x = lround(tilt.x * 90);
-  result.touches[0].tilt_y = lround(tilt.y * 90);
-  result.touches[0].tangential_pressure = [event tangentialPressure];
-  // NSEvent spec doesn't specify the range of rotation, we make sure that
-  // this value is in the range of [0,359].
-  int twist = (int)[event rotation];
-  twist = twist % 360;
-  if (twist < 0)
-    twist += 360;
-  result.touches[0].twist = twist;
-  float rotation_angle = twist % 180;
-  if (rotation_angle > 90)
-    rotation_angle = 180.f - rotation_angle;
-  result.touches[0].rotation_angle = rotation_angle;
-  return result;
-}
-
 }  // namespace content
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm
index 32f080a..2b619cc0 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm
+++ b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm
@@ -66,29 +66,6 @@
                            keyCode:key_code];
 }
 
-NSEvent* BuildFakeMouseEvent(CGEventType mouse_type,
-                             CGPoint location,
-                             CGMouseButton button,
-                             CGEventMouseSubtype subtype,
-                             float rotation = 0.0,
-                             float pressure = 0.0,
-                             float tilt_x = 0.0,
-                             float tilt_y = 0.0,
-                             float tangential_pressure = 0.0) {
-  CGEventRef cg_event =
-      CGEventCreateMouseEvent(NULL, mouse_type, location, button);
-  CGEventSetIntegerValueField(cg_event, kCGMouseEventSubtype, subtype);
-  CGEventSetDoubleValueField(cg_event, kCGTabletEventRotation, rotation);
-  CGEventSetDoubleValueField(cg_event, kCGMouseEventPressure, pressure);
-  CGEventSetDoubleValueField(cg_event, kCGTabletEventTiltX, tilt_x);
-  CGEventSetDoubleValueField(cg_event, kCGTabletEventTiltY, tilt_y);
-  CGEventSetDoubleValueField(cg_event, kCGTabletEventTangentialPressure,
-                             tangential_pressure);
-  NSEvent* event = [NSEvent eventWithCGEvent:cg_event];
-  CFRelease(cg_event);
-  return event;
-}
-
 }  // namespace
 
 // Test that arrow keys don't have numpad modifier set.
@@ -670,111 +647,3 @@
   EXPECT_EQ(web_event.PositionInWidget().y, ui_event.y());
   [window close];
 }
-
-// Test if the value of twist and rotation_angle are set correctly when the
-// NSEvent's rotation is less than 90.
-TEST(WebInputEventBuilderMacTest, TouchEventsWithPointerTypePenRotationLess90) {
-  NSEvent* mac_event =
-      BuildFakeMouseEvent(kCGEventLeftMouseDown, {6, 9}, kCGMouseButtonLeft,
-                          kCGEventMouseSubtypeTabletPoint, 60);
-  // Create a dummy window, but don't show it. It will be released when closed.
-  NSWindow* window =
-      [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
-                                  styleMask:NSBorderlessWindowMask
-                                    backing:NSBackingStoreBuffered
-                                      defer:NO];
-  blink::WebTouchEvent touch_event =
-      content::WebTouchEventBuilder::Build(mac_event, [window contentView]);
-  EXPECT_EQ(60, touch_event.touches[0].twist);
-  EXPECT_EQ(60, touch_event.touches[0].rotation_angle);
-}
-
-// Test if the value of twist and rotation_angle are set correctly when the
-// NSEvent's rotation is between 90 and 180.
-TEST(WebInputEventBuilderMacTest,
-     TouchEventsWithPointerTypePenRotationLess180) {
-  NSEvent* mac_event =
-      BuildFakeMouseEvent(kCGEventLeftMouseDown, {6, 9}, kCGMouseButtonLeft,
-                          kCGEventMouseSubtypeTabletPoint, 160);
-  // Create a dummy window, but don't show it. It will be released when closed.
-  NSWindow* window =
-      [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
-                                  styleMask:NSBorderlessWindowMask
-                                    backing:NSBackingStoreBuffered
-                                      defer:NO];
-  blink::WebTouchEvent touch_event =
-      content::WebTouchEventBuilder::Build(mac_event, [window contentView]);
-  EXPECT_EQ(160, touch_event.touches[0].twist);
-  EXPECT_EQ(20, touch_event.touches[0].rotation_angle);
-}
-
-// Test if the value of twist and rotation_angle are set correctly when the
-// NSEvent's rotation is between 180 and 360.
-TEST(WebInputEventBuilderMacTest,
-     TouchEventsWithPointerTypePenRotationLess360) {
-  NSEvent* mac_event =
-      BuildFakeMouseEvent(kCGEventLeftMouseDown, {6, 9}, kCGMouseButtonLeft,
-                          kCGEventMouseSubtypeTabletPoint, 260);
-  // Create a dummy window, but don't show it. It will be released when closed.
-  NSWindow* window =
-      [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
-                                  styleMask:NSBorderlessWindowMask
-                                    backing:NSBackingStoreBuffered
-                                      defer:NO];
-  blink::WebTouchEvent touch_event =
-      content::WebTouchEventBuilder::Build(mac_event, [window contentView]);
-  EXPECT_EQ(260, touch_event.touches[0].twist);
-  EXPECT_EQ(80, touch_event.touches[0].rotation_angle);
-}
-
-// Test if the value of twist and rotation_angle are set correctly when the
-// NSEvent's rotation is greater than 360.
-TEST(WebInputEventBuilderMacTest,
-     TouchEventsWithPointerTypePenRotationGreater360) {
-  NSEvent* mac_event =
-      BuildFakeMouseEvent(kCGEventLeftMouseDown, {6, 9}, kCGMouseButtonLeft,
-                          kCGEventMouseSubtypeTabletPoint, 390);
-  // Create a dummy window, but don't show it. It will be released when closed.
-  NSWindow* window =
-      [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
-                                  styleMask:NSBorderlessWindowMask
-                                    backing:NSBackingStoreBuffered
-                                      defer:NO];
-  blink::WebTouchEvent touch_event =
-      content::WebTouchEventBuilder::Build(mac_event, [window contentView]);
-  EXPECT_EQ(30, touch_event.touches[0].twist);
-  EXPECT_EQ(30, touch_event.touches[0].rotation_angle);
-}
-
-// Test if all the values of a WebTouchEvent are set correctly.
-TEST(WebInputEventBuilderMacTest, BuildWebTouchEvents) {
-  NSEvent* mac_event = BuildFakeMouseEvent(
-      kCGEventLeftMouseDown, {6, 9}, kCGMouseButtonLeft,
-      kCGEventMouseSubtypeTabletPoint, /* rotation */ 60,
-      /* pressure */ 0.3, /* tilt_x */ 0.5, /* tilt_y */ 0.6,
-      /* tangential_pressure */ 0.7);
-  // Create a dummy window, but don't show it. It will be released when closed.
-  NSWindow* window =
-      [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
-                                  styleMask:NSBorderlessWindowMask
-                                    backing:NSBackingStoreBuffered
-                                      defer:NO];
-  blink::WebTouchEvent touch_event =
-      content::WebTouchEventBuilder::Build(mac_event, [window contentView]);
-  EXPECT_EQ(blink::WebInputEvent::kTouchStart, touch_event.GetType());
-  EXPECT_FALSE(touch_event.hovering);
-  EXPECT_EQ(1U, touch_event.touches_length);
-  EXPECT_EQ(blink::WebFloatPoint(6, 9),
-            touch_event.touches[0].PositionInScreen());
-  EXPECT_EQ(blink::WebTouchPoint::kStatePressed, touch_event.touches[0].state);
-  EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen,
-            touch_event.touches[0].pointer_type);
-  EXPECT_EQ(0, touch_event.touches[0].id);
-  EXPECT_FLOAT_EQ(0.3, std::round(touch_event.touches[0].force * 10) / 10);
-  EXPECT_EQ(0.5 * 90, touch_event.touches[0].tilt_x);
-  EXPECT_EQ(0.6 * 90, touch_event.touches[0].tilt_y);
-  EXPECT_FLOAT_EQ(
-      0.7, std::round(touch_event.touches[0].tangential_pressure * 10) / 10);
-  EXPECT_EQ(60, touch_event.touches[0].twist);
-  EXPECT_EQ(60, touch_event.touches[0].rotation_angle);
-}
\ No newline at end of file
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index eef4e56..9a38500d 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2716,6 +2716,11 @@
       child_connection_->service_token());
   command_line->AppendSwitchASCII(switches::kRendererClientId,
                                   std::to_string(GetID()));
+
+  if (SiteIsolationPolicy::UseDedicatedProcessesForAllSites()) {
+    // Disable V8 code mitigations if renderer processes are site-isolated.
+    command_line->AppendSwitch(switches::kNoV8UntrustedCodeMitigations);
+  }
 }
 
 void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
diff --git a/content/browser/renderer_host/render_widget_host_ns_view_client.h b/content/browser/renderer_host/render_widget_host_ns_view_client.h
index c7e67f8d..92f4fd7 100644
--- a/content/browser/renderer_host/render_widget_host_ns_view_client.h
+++ b/content/browser/renderer_host/render_widget_host_ns_view_client.h
@@ -53,8 +53,6 @@
   // Forward events to the renderer or the input router, as appropriate.
   virtual void RouteOrProcessMouseEvent(
       const blink::WebMouseEvent& web_event) = 0;
-  virtual void RouteOrProcessTouchEvent(
-      const blink::WebTouchEvent& web_event) = 0;
   virtual void RouteOrProcessWheelEvent(
       const blink::WebMouseWheelEvent& web_event) = 0;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_cocoa.h b/content/browser/renderer_host/render_widget_host_view_cocoa.h
index 83af25a..b2d9cec 100644
--- a/content/browser/renderer_host/render_widget_host_view_cocoa.h
+++ b/content/browser/renderer_host/render_widget_host_view_cocoa.h
@@ -189,12 +189,6 @@
   // The filter used to guide touch events towards a horizontal or vertical
   // orientation.
   content::MouseWheelRailsFilterMac mouseWheelFilter_;
-
-  // Whether the direct manipulation feature is enabled.
-  bool direct_manipulation_enabled_;
-
-  // Whether the pen's tip is in contact with the stylus digital tablet.
-  bool has_pen_contact_;
 }
 
 @property(nonatomic, assign) NSRange markedRange;
diff --git a/content/browser/renderer_host/render_widget_host_view_cocoa.mm b/content/browser/renderer_host/render_widget_host_view_cocoa.mm
index 92f940e..8b84322 100644
--- a/content/browser/renderer_host/render_widget_host_view_cocoa.mm
+++ b/content/browser/renderer_host/render_widget_host_view_cocoa.mm
@@ -24,7 +24,6 @@
 #import "ui/base/clipboard/clipboard_util_mac.h"
 #import "ui/base/cocoa/appkit_utils.h"
 #include "ui/base/cocoa/cocoa_base_utils.h"
-#include "ui/base/ui_base_features.h"
 #include "ui/display/screen.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/dom/dom_code.h"
@@ -42,12 +41,10 @@
 using content::WebGestureEventBuilder;
 using content::WebMouseEventBuilder;
 using content::WebMouseWheelEventBuilder;
-using content::WebTouchEventBuilder;
 using blink::WebInputEvent;
 using blink::WebMouseEvent;
 using blink::WebMouseWheelEvent;
 using blink::WebGestureEvent;
-using blink::WebTouchEvent;
 
 namespace {
 
@@ -90,10 +87,6 @@
       const blink::WebMouseEvent& web_event) override {
     client_->RouteOrProcessMouseEvent(TranslateEvent(web_event));
   }
-  void RouteOrProcessTouchEvent(
-      const blink::WebTouchEvent& web_event) override {
-    client_->RouteOrProcessTouchEvent(TranslateEvent(web_event));
-  }
   void RouteOrProcessWheelEvent(
       const blink::WebMouseWheelEvent& web_event) override {
     client_->RouteOrProcessWheelEvent(TranslateEvent(web_event));
@@ -230,9 +223,6 @@
     isStylusEnteringProximity_ = false;
     keyboardLockActive_ = false;
     textInputType_ = ui::TEXT_INPUT_TYPE_NONE;
-    direct_manipulation_enabled_ =
-        base::FeatureList::IsEnabled(features::kDirectManipulationStylus);
-    has_pen_contact_ = false;
   }
   return self;
 }
@@ -552,37 +542,9 @@
   if (type == NSMouseMoved)
     cursorHidden_ = NO;
 
-  bool send_touch =
-      direct_manipulation_enabled_ &&
-      pointerType_ == blink::WebPointerProperties::PointerType::kPen;
-
-  // Send touch events when the pen is in contact with the tablet.
-  if (send_touch) {
-    // Because the NSLeftMouseUp event's buttonMask is not
-    // NSEventButtonMaskPenTip, we read |has_pen_contact_| to ensure a
-    // TouchRelease is sent appropriately at the end when the stylus is
-    // no longer in contact with the digitizer.
-    send_touch = has_pen_contact_;
-    if (type == NSLeftMouseDown || type == NSLeftMouseUp ||
-        type == NSLeftMouseDragged) {
-      NSEventButtonMask buttonMask = [theEvent buttonMask];
-      if (buttonMask == NSEventButtonMaskPenTip) {
-        DCHECK(type != NSLeftMouseUp);
-        send_touch = has_pen_contact_ = true;
-      } else {
-        has_pen_contact_ = false;
-      }
-    }
-  }
-
-  if (!send_touch) {
-    WebMouseEvent event =
-        WebMouseEventBuilder::Build(theEvent, self, pointerType_);
-    localClient_->RouteOrProcessMouseEvent(event);
-  } else {
-    WebTouchEvent event = WebTouchEventBuilder::Build(theEvent, self);
-    localClient_->RouteOrProcessTouchEvent(event);
-  }
+  WebMouseEvent event =
+      WebMouseEventBuilder::Build(theEvent, self, pointerType_);
+  localClient_->RouteOrProcessMouseEvent(event);
 }
 
 - (void)tabletEvent:(NSEvent*)theEvent {
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 534e667..052bcb27 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -308,7 +308,6 @@
       const ui::LatencyInfo& latency_info,
       const std::vector<EditCommand>& commands) override;
   void RouteOrProcessMouseEvent(const blink::WebMouseEvent& web_event) override;
-  void RouteOrProcessTouchEvent(const blink::WebTouchEvent& web_event) override;
   void RouteOrProcessWheelEvent(
       const blink::WebMouseWheelEvent& web_event) override;
   void ForwardMouseEvent(const blink::WebMouseEvent& web_event) override;
@@ -340,7 +339,6 @@
       bool skip_in_browser,
       const std::vector<EditCommand>& commands) override;
   void RouteOrProcessMouseEvent(std::unique_ptr<InputEvent> event) override;
-  void RouteOrProcessTouchEvent(std::unique_ptr<InputEvent> event) override;
   void RouteOrProcessWheelEvent(std::unique_ptr<InputEvent> event) override;
   void ForwardMouseEvent(std::unique_ptr<InputEvent> event) override;
   void ForwardWheelEvent(std::unique_ptr<InputEvent> event) override;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index b3bba4e..0703dd02c 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -1488,24 +1488,6 @@
   }
 }
 
-void RenderWidgetHostViewMac::RouteOrProcessTouchEvent(
-    const blink::WebTouchEvent& const_web_event) {
-  blink::WebTouchEvent web_event = const_web_event;
-  ui::FilteredGestureProvider::TouchHandlingResult result =
-      gesture_provider_.OnTouchEvent(MotionEventWeb(web_event));
-  if (!result.succeeded)
-    return;
-
-  ui::LatencyInfo latency_info(ui::SourceEventType::OTHER);
-  latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT);
-  if (ShouldRouteEvent(web_event)) {
-    host()->delegate()->GetInputEventRouter()->RouteTouchEvent(this, &web_event,
-                                                               latency_info);
-  } else {
-    ProcessTouchEvent(web_event, latency_info);
-  }
-}
-
 void RenderWidgetHostViewMac::RouteOrProcessWheelEvent(
     const blink::WebMouseWheelEvent& const_web_event) {
   blink::WebMouseWheelEvent web_event = const_web_event;
@@ -1868,7 +1850,6 @@
   ForwardKeyboardEventWithCommands(native_event, input_event->latency_info,
                                    commands);
 }
-
 void RenderWidgetHostViewMac::RouteOrProcessMouseEvent(
     std::unique_ptr<InputEvent> input_event) {
   if (!input_event || !input_event->web_event ||
@@ -1882,19 +1863,6 @@
   RouteOrProcessMouseEvent(mouse_event);
 }
 
-void RenderWidgetHostViewMac::RouteOrProcessTouchEvent(
-    std::unique_ptr<InputEvent> input_event) {
-  if (!input_event || !input_event->web_event ||
-      !blink::WebInputEvent::IsTouchEventType(
-          input_event->web_event->GetType())) {
-    DLOG(ERROR) << "Absent or non-TouchEventType event.";
-    return;
-  }
-  const blink::WebTouchEvent& touch_event =
-      static_cast<const blink::WebTouchEvent&>(*input_event->web_event);
-  RouteOrProcessTouchEvent(touch_event);
-}
-
 void RenderWidgetHostViewMac::RouteOrProcessWheelEvent(
     std::unique_ptr<InputEvent> input_event) {
   if (!input_event || !input_event->web_event ||
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
index 01400ba3..1eef2120 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -52,7 +52,6 @@
 #include "ui/base/cocoa/secure_password_input.h"
 #import "ui/base/test/cocoa_helper.h"
 #import "ui/base/test/scoped_fake_nswindow_focus.h"
-#include "ui/base/ui_base_features.h"
 #include "ui/compositor/recyclable_compositor_mac.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/blink/blink_features.h"
@@ -135,30 +134,20 @@
   for (auto& event : events)
     result.push_back(event->name());
   return base::JoinString(result, " ");
-}
+    }
 
-blink::WebPointerProperties::PointerType GetPointerType(
-    const MockWidgetInputHandler::MessageVector& events) {
-  EXPECT_EQ(events.size(), 1U);
-  MockWidgetInputHandler::DispatchedEventMessage* event = events[0]->ToEvent();
-  if (!event)
-    return blink::WebPointerProperties::PointerType::kUnknown;
-
-  if (blink::WebInputEvent::IsMouseEventType(
-          event->Event()->web_event->GetType())) {
-    return static_cast<const blink::WebMouseEvent*>(
-               event->Event()->web_event.get())
-        ->pointer_type;
-  }
-
-  if (blink::WebInputEvent::IsTouchEventType(
-          event->Event()->web_event->GetType())) {
-    return static_cast<const blink::WebTouchEvent*>(
-               event->Event()->web_event.get())
-        ->touches[0]
-        .pointer_type;
-  }
-  return blink::WebPointerProperties::PointerType::kUnknown;
+    blink::WebPointerProperties::PointerType GetPointerType(
+        const MockWidgetInputHandler::MessageVector& events) {
+      EXPECT_EQ(events.size(), 1U);
+      MockWidgetInputHandler::DispatchedEventMessage* event =
+          events[0]->ToEvent();
+      if (event && blink::WebInputEvent::IsMouseEventType(
+                       event->Event()->web_event->GetType())) {
+        return static_cast<const blink::WebMouseEvent*>(
+                   event->Event()->web_event.get())
+            ->pointer_type;
+      }
+      return blink::WebPointerProperties::PointerType::kUnknown;
 }
 
 NSEvent* MockTabletEventWithParams(CGEventType type,
@@ -179,20 +168,12 @@
                                   CGPoint location,
                                   CGMouseButton button,
                                   CGEventMouseSubtype subtype,
-                                  bool is_entering_proximity = false,
-                                  bool is_pen_tip = false) {
+                                  bool is_entering_proximity = false) {
   CGEventRef cg_event =
       CGEventCreateMouseEvent(NULL, mouse_type, location, button);
   CGEventSetIntegerValueField(cg_event, kCGMouseEventSubtype, subtype);
   CGEventSetIntegerValueField(cg_event, kCGTabletProximityEventEnterProximity,
                               is_entering_proximity);
-  CGEventSetIntegerValueField(cg_event, kCGTabletEventRotation, 300);
-  if (is_pen_tip)
-    CGEventSetIntegerValueField(cg_event, kCGTabletEventPointButtons, 1);
-  CGEventTimestamp timestamp =
-      (ui::EventTimeForNow() - base::TimeTicks()).InMicroseconds() *
-      base::Time::kNanosecondsPerMicrosecond;
-  CGEventSetTimestamp(cg_event, timestamp);
   NSEvent* event = [NSEvent eventWithCGEvent:cg_event];
   CFRelease(cg_event);
   return event;
@@ -379,9 +360,6 @@
 
   void SetUp() override {
     RenderViewHostImplTestHarness::SetUp();
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndEnableFeature(features::kDirectManipulationStylus);
-
     gpu::ImageTransportSurface::SetAllowOSMesaForTesting(true);
 
     browser_context_ = std::make_unique<TestBrowserContext>();
@@ -968,77 +946,6 @@
             GetPointerType(events));
 }
 
-TEST_F(RenderWidgetHostViewMacTest, PointerEventWithPenTypeSendAsTouch) {
-  // Send a NSEvent of NSTabletProximity type which has a device type of pen.
-  NSEvent* event = MockTabletEventWithParams(kCGEventTabletProximity, true,
-                                             NSPenPointingDevice);
-  [rwhv_mac_->cocoa_view() tabletEvent:event];
-  // Flush and clear other messages (e.g. begin frames) the RWHVMac also sends.
-  base::RunLoop().RunUntilIdle();
-  static_cast<RenderWidgetHostImpl*>(rwhv_mac_->GetRenderWidgetHost())
-      ->input_router()
-      ->ForceSetTouchActionAuto();
-
-  event = MockMouseEventWithParams(
-      kCGEventLeftMouseDown, {6, 9}, kCGMouseButtonLeft,
-      kCGEventMouseSubtypeTabletPoint, false, true);
-  [rwhv_mac_->cocoa_view() mouseEvent:event];
-  base::RunLoop().RunUntilIdle();
-  MockWidgetInputHandler::MessageVector events =
-      host_->GetAndResetDispatchedMessages();
-  ASSERT_EQ("TouchStart", GetMessageNames(events));
-  EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen,
-            GetPointerType(events));
-  events.clear();
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-
-  event = MockMouseEventWithParams(
-      kCGEventLeftMouseDragged, {16, 29}, kCGMouseButtonLeft,
-      kCGEventMouseSubtypeTabletPoint, false, true);
-  [rwhv_mac_->cocoa_view() mouseEvent:event];
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-  ASSERT_EQ("TouchMove", GetMessageNames(events));
-  EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen,
-            GetPointerType(events));
-
-  events.clear();
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-
-  event = MockMouseEventWithParams(kCGEventLeftMouseUp, {16, 29},
-                                   kCGMouseButtonLeft,
-                                   kCGEventMouseSubtypeTabletPoint, false);
-  [rwhv_mac_->cocoa_view() mouseEvent:event];
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-  ASSERT_EQ("TouchEnd GestureScrollEnd", GetMessageNames(events));
-  EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen,
-            static_cast<const blink::WebTouchEvent*>(
-                events[0]->ToEvent()->Event()->web_event.get())
-                ->touches[0]
-                .pointer_type);
-
-  events.clear();
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-
-  event =
-      MockMouseEventWithParams(kCGEventLeftMouseDown, {6, 9},
-                               kCGMouseButtonLeft, kCGEventMouseSubtypeDefault);
-  [rwhv_mac_->cocoa_view() mouseEvent:event];
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-  ASSERT_EQ("MouseDown", GetMessageNames(events));
-  EXPECT_EQ(blink::WebPointerProperties::PointerType::kMouse,
-            GetPointerType(events));
-
-  events.clear();
-  base::RunLoop().RunUntilIdle();
-  events = host_->GetAndResetDispatchedMessages();
-}
-
 TEST_F(RenderWidgetHostViewMacTest, SendMouseMoveOnShowingContextMenu) {
   rwhv_mac_->SetShowingContextMenu(true);
   base::RunLoop().RunUntilIdle();
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index e3b04ed..dc977d5 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -623,13 +623,18 @@
 
   EXPECT_TRUE(NavigateToURL(shell(), start_url));
 
-  RenderProcessHostKillWaiter kill_waiter(
-      shell()->web_contents()->GetMainFrame()->GetProcess());
+  RenderFrameHostImpl* frame = static_cast<RenderFrameHostImpl*>(
+      shell()->web_contents()->GetMainFrame());
+  RenderProcessHostKillWaiter kill_waiter(frame->GetProcess());
 
   ScopedInterfaceProviderRequestReplacer replacer(shell()->web_contents(),
                                                   nullptr);
   NavigateToURLAndExpectNoCommit(shell(), non_same_document_url);
   EXPECT_EQ(bad_message::RFH_INTERFACE_PROVIDER_MISSING, kill_waiter.Wait());
+
+  // Verify that the death of the renderer process doesn't leave behing and leak
+  // NavigationRequests - see https://crbug.com/869193.
+  EXPECT_EQ(0u, frame->GetNavigationEntryIdsPendingCommit().size());
 }
 
 // Test that a compromised renderer cannot ask to upload an arbitrary file in
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index 0c7af212..464285b 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -320,6 +320,16 @@
   controller_registration_.reset();
   RemoveAllMatchingRegistrations();
 
+  // Explicitly destroy the ServiceWorkerObjectHosts and
+  // ServiceWorkerRegistrationObjectHosts owned by |this|. Otherwise, this
+  // destructor can trigger their Mojo connection error handlers, which would
+  // call back into halfway destroyed |this|. This is because they are
+  // associated with the ServiceWorker interface, which can be destroyed while
+  // in this destructor (|running_hosted_version_|'s |event_dispatcher_|). See
+  // https://crbug.com/854993.
+  service_worker_object_hosts_.clear();
+  registration_object_hosts_.clear();
+
   // This host may be destroyed before it received the anticipated
   // HintToUpdateServiceWorker IPC from the renderer. This can occur on
   // navigation failure or if the frame closed soon after navigation. The
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 904109b0..113a07f 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3245,10 +3245,10 @@
 
   if (new_contents && source_render_frame_host && new_contents != this) {
     for (auto& observer : observers_) {
-      observer.DidOpenRequestedURL(new_contents, source_render_frame_host,
-                                   params.url, params.referrer,
-                                   params.disposition, params.transition,
-                                   params.started_from_context_menu, false);
+      observer.DidOpenRequestedURL(
+          new_contents, source_render_frame_host, params.url, params.referrer,
+          params.disposition, params.transition,
+          params.started_from_context_menu, params.is_renderer_initiated);
     }
   }
 
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 85cb66f..79bb417 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -2753,4 +2753,63 @@
             web_contents->current_fullscreen_frame_tree_node_id_);
 }
 
+class MockDidOpenRequestedURLObserver : public WebContentsObserver {
+ public:
+  explicit MockDidOpenRequestedURLObserver(Shell* shell)
+      : WebContentsObserver(shell->web_contents()) {}
+
+  MOCK_METHOD8(DidOpenRequestedURL,
+               void(WebContents* new_contents,
+                    RenderFrameHost* source_render_frame_host,
+                    const GURL& url,
+                    const Referrer& referrer,
+                    WindowOpenDisposition disposition,
+                    ui::PageTransition transition,
+                    bool started_from_context_menu,
+                    bool renderer_initiated));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockDidOpenRequestedURLObserver);
+};
+
+// Test WebContentsObserver::DidOpenRequestedURL for ctrl-click-ed links.
+// This is a regression test for https://crbug.com/864736 (although it also
+// covers slightly more ground than just the |is_renderer_initiated| value).
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, CtrlClickSubframeLink) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // Load a page with a subframe link.
+  GURL main_url(
+      embedded_test_server()->GetURL("/ctrl-click-subframe-link.html"));
+  NavigateToURL(shell(), main_url);
+
+  // Start intercepting the DidOpenRequestedURL callback.
+  MockDidOpenRequestedURLObserver mock_observer(shell());
+  WebContents* new_web_contents1 = nullptr;
+  RenderFrameHost* subframe = shell()->web_contents()->GetAllFrames()[1];
+  EXPECT_CALL(mock_observer,
+              DidOpenRequestedURL(
+                  ::testing::_,  // new_contents (captured via SaveArg below)
+                  subframe,      // source_render_frame_host
+                  embedded_test_server()->GetURL("/title1.html"),
+                  ::testing::Field(&Referrer::url, main_url),
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                  ::testing::Truly([](ui::PageTransition arg) {
+                    return ui::PageTransitionCoreTypeIs(
+                        arg, ui::PAGE_TRANSITION_LINK);
+                  }),
+                  false,  // started_from_context_menu
+                  true))  // is_renderer_initiated
+      .WillOnce(testing::SaveArg<0>(&new_web_contents1));
+
+  // Simulate a ctrl click on the link and ask GMock to verify that the
+  // MockDidOpenRequestedURLObserver got called with the expected args.
+  WebContentsAddedObserver new_web_contents_observer;
+  EXPECT_TRUE(ExecuteScript(
+      shell(), "window.domAutomationController.send(ctrlClickLink());"));
+  WebContents* new_web_contents2 = new_web_contents_observer.GetWebContents();
+  EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(&mock_observer));
+  EXPECT_EQ(new_web_contents1, new_web_contents2);
+}
+
 }  // namespace content
diff --git a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
index ad72377..e68b81b 100644
--- a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
+++ b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
@@ -109,8 +109,17 @@
   MakeTypicalCall("testCanvasCapture(drawWebGL);", kCanvasCaptureTestHtmlFile);
 }
 
+#if defined(OS_WIN)
+// https://crbug.com/869723
+// Flaky on Windows 10 with Viz (i.e. in viz_content_browsertests).
+#define MAYBE_VerifyCanvasCaptureOffscreenCanvasFrames \
+  DISABLED_VerifyCanvasCaptureOffscreenCanvasFrames
+#else
+#define MAYBE_VerifyCanvasCaptureOffscreenCanvasFrames \
+  VerifyCanvasCaptureOffscreenCanvasFrames
+#endif
 IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
-                       VerifyCanvasCaptureOffscreenCanvasFrames) {
+                       MAYBE_VerifyCanvasCaptureOffscreenCanvasFrames) {
   MakeTypicalCall("testCanvasCapture(drawOffscreenCanvas);",
                   kCanvasCaptureTestHtmlFile);
 }
diff --git a/content/common/render_widget_host_ns_view.mojom b/content/common/render_widget_host_ns_view.mojom
index c0afeb7..08667c11 100644
--- a/content/common/render_widget_host_ns_view.mojom
+++ b/content/common/render_widget_host_ns_view.mojom
@@ -143,7 +143,6 @@
 
   // Forward events to the renderer or the input router, as appropriate.
   RouteOrProcessMouseEvent(Event event);
-  RouteOrProcessTouchEvent(Event event);
   RouteOrProcessWheelEvent(Event event);
 
   // Special case forwarding of synthetic events to the renderer.
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 19c2246..8fd9c696 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -624,6 +624,9 @@
 // zygote to work.
 const char kNoZygote[] = "no-zygote";
 
+// Disables V8 mitigations for executing untrusted code.
+const char kNoV8UntrustedCodeMitigations[] = "no-v8-untrusted-code-mitigations";
+
 // Number of worker threads used to rasterize content.
 const char kNumRasterThreads[]              = "num-raster-threads";
 
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 2c795e8..df013d7 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -186,6 +186,7 @@
 CONTENT_EXPORT extern const char kMHTMLSkipNostoreAll[];
 CONTENT_EXPORT extern const char kMojoLocalStorage[];
 CONTENT_EXPORT extern const char kNoZygote[];
+extern const char kNoV8UntrustedCodeMitigations[];
 CONTENT_EXPORT extern const char kEnableAppContainer[];
 CONTENT_EXPORT extern const char kDisableAppContainer[];
 CONTENT_EXPORT extern const char kNumRasterThreads[];
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index 80559a1..739aed86 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -191,6 +191,12 @@
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
 
+  if (command_line.HasSwitch(switches::kNoV8UntrustedCodeMitigations)) {
+    const char* disable_mitigations = "--no-untrusted-code-mitigations";
+    v8::V8::SetFlagsFromString(disable_mitigations,
+                               strlen(disable_mitigations));
+  }
+
   if (command_line.HasSwitch(switches::kJavaScriptFlags)) {
     std::string flags(
         command_line.GetSwitchValueASCII(switches::kJavaScriptFlags));
diff --git a/content/test/data/ctrl-click-subframe-link.html b/content/test/data/ctrl-click-subframe-link.html
index 6492a05..5c33fd2 100644
--- a/content/test/data/ctrl-click-subframe-link.html
+++ b/content/test/data/ctrl-click-subframe-link.html
@@ -2,7 +2,12 @@
 <head>
 <script>
   function simulateCtrlClick(target) {
-    var evt = new MouseEvent("click", { "ctrlKey": true });
+    var is_mac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
+    if (is_mac) {
+      var evt = new MouseEvent("click", { "metaKey": true });
+    } else {
+      var evt = new MouseEvent("click", { "ctrlKey": true });
+    }
     return target.dispatchEvent(evt);
   }
   function ctrlClickLink() {
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index bb402a22..ef010573 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -58,14 +58,14 @@
     # TODO(kbr): flakily timing out on this configuration.
     self.Flaky('*', ['linux', 'intel', 'debug'], bug=648369)
 
-    # self.Flaky('Pixel_Video_MP4', ['android', 'nvidia'], bug=716564)
-    # self.Flaky('Pixel_Video_MP4', ['linux', 'nvidia'], bug=819635)
+    self.Flaky('Pixel_Video_MP4', ['android', 'nvidia'], bug=716564)
+    self.Flaky('Pixel_Video_MP4', ['linux', 'nvidia'], bug=819635)
 
     # TODO(junov): rebaselining
-    # self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing',
-    #          ['mac', 'linux', 'win', 'android', 'chromeos'], bug=788439)
-    # self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker',
-    #          ['mac', 'linux', 'win', 'android', 'chromeos'], bug=788439)
+    self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing',
+              ['mac', 'linux', 'win', 'android', 'chromeos'], bug=788439)
+    self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker',
+              ['mac', 'linux', 'win', 'android', 'chromeos'], bug=788439)
 
     # Flaky for unknown reasons only on macOS. Not planning to investigate
     # further.
@@ -82,14 +82,14 @@
         ['android', ('qualcomm', 'Adreno (TM) 330')], bug=773293)
 
     # Failing on Mac Intel HighSierra
-    # self.Fail('Pixel_Video_MP4',
-    #    ['highsierra', ('intel', 0xa2e)], bug=774809)
-    # self.Fail('Pixel_Video_VP9',
-    #     ['highsierra', ('intel', 0xa2e)], bug=774809)
+    self.Fail('Pixel_Video_MP4',
+        ['highsierra', ('intel', 0xa2e)], bug=774809)
+    self.Fail('Pixel_Video_VP9',
+        ['highsierra', ('intel', 0xa2e)], bug=774809)
     self.Fail('Pixel_WebGLGreenTriangle_NonChromiumImage_NoAA_NoAlpha',
         ['highsierra', ('intel', 0xa2e)], bug=774809)
-    # self.Flaky('Pixel_OffscreenCanvasTransferBeforeStyleResize',
-    #    ['highsierra', ('intel', 0xa2e)], bug=857578)
+    self.Flaky('Pixel_OffscreenCanvasTransferBeforeStyleResize',
+        ['highsierra', ('intel', 0xa2e)], bug=857578)
 
     # Failing on NVIDIA Shield TV; not sure why yet.
     self.Fail('Pixel_WebGL_PremultipliedAlpha_False',
@@ -103,8 +103,8 @@
               ['linux', 'mac', 'win'], bug=744658)
 
     # TODO(fserb): temporarily suppress this test.
-    # self.Flaky('Pixel_OffscreenCanvas2DResizeOnWorker',
-    #    ['linux', 'mac'], bug=840394)
+    self.Flaky('Pixel_OffscreenCanvas2DResizeOnWorker',
+        ['linux', 'mac'], bug=840394)
     self.Fail('Pixel_WorkerRAF_OOPD', ['android', 'nvidia'], bug=833902)
     self.Fail('Pixel_WorkerRAF_OOPD', ['mac'], bug=851213)
 
@@ -113,32 +113,8 @@
     self.Fail('Pixel_WebGLSadCanvas', ['android'], bug=575305)
 
     # Flaky on Android: crbug.com/860548
-    # self.Flaky('Pixel_Video_VP9', ['android'], bug=860548)
+    self.Flaky('Pixel_Video_VP9', ['android'], bug=860548)
 
     self.Fail('Pixel_CanvasLowLatencyWebGL', ['android', 'nvidia'], bug=868596)
     self.Fail('Pixel_OffscreenCanvasWebGLPaintAfterResize',
               ['android', 'nvidia'], bug=868596)
-
-    # Rebaseline tests for enabling use-zoom-for-dsf on Android
-    self.Fail('Pixel_2DCanvasWebGL', bug=737777)
-    self.Fail('Pixel_CSS3DBlueBox', bug=737777)
-    self.Fail('Pixel_Canvas2DRedBox', bug=737777)
-    self.Fail('Pixel_CanvasDisplayLinearRGBAccelerated2D', bug=737777)
-    self.Fail('Pixel_CanvasDisplayLinearRGBUnaccelerated2DGPUCompositing', bug=737777)
-    self.Fail('Pixel_OffscreenCanvas2DResizeOnWorker', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasTransferAfterStyleResize', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasTransferBeforeStyleResize', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasTransferToImageBitmap', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasTransferToImageBitmapWorker', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasWebGLDefault', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasWebGLDefaultWorker', bug=737777)
-    self.Fail('Pixel_OffscreenCanvasWebglResizeOnWorker', bug=737777)
-    self.Fail('Pixel_Video_MP4', bug=737777)
-    self.Fail('Pixel_Video_VP9', bug=737777)
-    self.Fail('Pixel_WebGLGreenTriangle_AA_Alpha', bug=737777)
-    self.Fail('Pixel_WebGLGreenTriangle_AA_NoAlpha', bug=737777)
-    self.Fail('Pixel_WebGLGreenTriangle_NoAA_Alpha', bug=737777)
-    self.Fail('Pixel_WebGLGreenTriangle_NoAA_NoAlpha', bug=737777)
-    self.Fail('Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear', bug=737777)
diff --git a/extensions/browser/extension_protocols.cc b/extensions/browser/extension_protocols.cc
index 50bde06..f7146a3e9 100644
--- a/extensions/browser/extension_protocols.cc
+++ b/extensions/browser/extension_protocols.cc
@@ -196,7 +196,7 @@
                          const std::string& content_security_policy,
                          bool send_cors_header,
                          bool follow_symlinks_anywhere,
-                         ContentVerifyJob* verify_job)
+                         scoped_refptr<ContentVerifyJob> verify_job)
       : net::URLRequestFileJob(
             request,
             network_delegate,
@@ -204,7 +204,7 @@
             base::CreateTaskRunnerWithTraits(
                 {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
                  base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
-        verify_job_(verify_job),
+        verify_job_(std::move(verify_job)),
         seek_position_(0),
         bytes_read_(0),
         directory_path_(directory_path),
@@ -643,7 +643,7 @@
   if (g_test_handler)
     g_test_handler->Run(&directory_path, &relative_path);
 
-  ContentVerifyJob* verify_job = nullptr;
+  scoped_refptr<ContentVerifyJob> verify_job;
   ContentVerifier* verifier = extension_info_map_->content_verifier();
   if (verifier) {
     verify_job =
@@ -652,15 +652,10 @@
       verify_job->Start(verifier);
   }
 
-  return new URLRequestExtensionJob(request,
-                                    network_delegate,
-                                    extension_id,
-                                    directory_path,
-                                    relative_path,
-                                    content_security_policy,
-                                    send_cors_header,
-                                    follow_symlinks_anywhere,
-                                    verify_job);
+  return new URLRequestExtensionJob(
+      request, network_delegate, extension_id, directory_path, relative_path,
+      content_security_policy, send_cors_header, follow_symlinks_anywhere,
+      std::move(verify_job));
 }
 
 bool ExtensionProtocolHandler::IsSafeRedirectTarget(
@@ -962,7 +957,7 @@
       scoped_refptr<ContentVerifier> content_verifier,
       const ExtensionResource& resource,
       scoped_refptr<net::HttpResponseHeaders> response_headers) {
-    ContentVerifyJob* verify_job = nullptr;
+    scoped_refptr<ContentVerifyJob> verify_job;
     if (content_verifier) {
       verify_job = content_verifier->CreateJobFor(resource.extension_id(),
                                                   resource.extension_root(),
@@ -973,7 +968,7 @@
 
     content::CreateFileURLLoader(
         request, std::move(loader), std::move(client),
-        std::make_unique<FileLoaderObserver>(verify_job),
+        std::make_unique<FileLoaderObserver>(std::move(verify_job)),
         std::move(response_headers));
   }
 
diff --git a/extensions/common/permissions/permission_set.cc b/extensions/common/permissions/permission_set.cc
index 59fa3bd..dd815d5 100644
--- a/extensions/common/permissions/permission_set.cc
+++ b/extensions/common/permissions/permission_set.cc
@@ -73,7 +73,8 @@
 // static
 std::unique_ptr<const PermissionSet> PermissionSet::CreateIntersection(
     const PermissionSet& set1,
-    const PermissionSet& set2) {
+    const PermissionSet& set2,
+    URLPatternSet::IntersectionBehavior intersection_behavior) {
   APIPermissionSet apis;
   APIPermissionSet::Intersection(set1.apis(), set2.apis(), &apis);
 
@@ -82,15 +83,10 @@
                                       set2.manifest_permissions(),
                                       &manifest_permissions);
 
-  // TODO(https://crbug.com/867549): Audit callers of CreateIntersection() and
-  // determine what the proper intersection behavior is. Likely, we'll want to
-  // introduce an argument to specify it.
-  constexpr auto kIntersectionBehavior =
-      URLPatternSet::IntersectionBehavior::kPatternsContainedByBoth;
   URLPatternSet explicit_hosts = URLPatternSet::CreateIntersection(
-      set1.explicit_hosts(), set2.explicit_hosts(), kIntersectionBehavior);
+      set1.explicit_hosts(), set2.explicit_hosts(), intersection_behavior);
   URLPatternSet scriptable_hosts = URLPatternSet::CreateIntersection(
-      set1.scriptable_hosts(), set2.scriptable_hosts(), kIntersectionBehavior);
+      set1.scriptable_hosts(), set2.scriptable_hosts(), intersection_behavior);
 
   return base::WrapUnique(new PermissionSet(apis, manifest_permissions,
                                             explicit_hosts, scriptable_hosts));
diff --git a/extensions/common/permissions/permission_set.h b/extensions/common/permissions/permission_set.h
index 26a5289..f19535f2 100644
--- a/extensions/common/permissions/permission_set.h
+++ b/extensions/common/permissions/permission_set.h
@@ -48,9 +48,13 @@
 
   // Creates a new permission set equal to the intersection of |set1| and
   // |set2|.
+  // TODO(https://crbug.com/867549): Audit callers of CreateIntersection() and
+  // have them determine the proper intersection behavior.
   static std::unique_ptr<const PermissionSet> CreateIntersection(
       const PermissionSet& set1,
-      const PermissionSet& set2);
+      const PermissionSet& set2,
+      URLPatternSet::IntersectionBehavior intersection_behavior =
+          URLPatternSet::IntersectionBehavior::kPatternsContainedByBoth);
 
   // Creates a new permission set equal to the union of |set1| and |set2|.
   static std::unique_ptr<const PermissionSet> CreateUnion(
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index c14cff85..20bc4420 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//build/config/features.gni")
 import("//build/config/ui.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//components/nacl/features.gni")
 import("//extensions/buildflags/buildflags.gni")
@@ -360,8 +361,8 @@
 process_version("version_header") {
   template_file = "common/version.h.in"
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
+    lastchange_file,
   ]
   output = "$target_gen_dir/common/version.h"
 }
diff --git a/extensions/shell/installer/linux/BUILD.gn b/extensions/shell/installer/linux/BUILD.gn
index 1f07d353..09f39443 100644
--- a/extensions/shell/installer/linux/BUILD.gn
+++ b/extensions/shell/installer/linux/BUILD.gn
@@ -9,6 +9,7 @@
 import("//build/config/features.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/sysroot.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/version.gni")
 import("//chrome/process_version_rc_template.gni")  # For branding_file_path.
 import("//components/nacl/features.gni")
@@ -102,9 +103,9 @@
   # Just output the default version info variables (no template).
   process_only = true
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
     branding_file_path,
+    lastchange_file,
   ]
   output = "$root_out_dir/app_shell_installer/version.txt"
 }
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 7ab88b7b..f295efb 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/chrome_build.gni")
+import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//headless/headless.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
@@ -927,8 +928,8 @@
 process_version("version_header") {
   template_file = "public/version.h.in"
   sources = [
-    "//build/util/LASTCHANGE",
     "//chrome/VERSION",
+    lastchange_file,
   ]
   output = "$target_gen_dir/public/version.h"
 }
diff --git a/headless/test/data/protocol/sanity/renderer-client-redirect-chain-no-js.js b/headless/test/data/protocol/sanity/renderer-client-redirect-chain-no-js.js
index 4c8ae24..2290cbdd 100644
--- a/headless/test/data/protocol/sanity/renderer-client-redirect-chain-no-js.js
+++ b/headless/test/data/protocol/sanity/renderer-client-redirect-chain-no-js.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: chained client redirection with js disabled.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-client-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-client-redirect-chain.js
index 19da184..078cb2e0 100644
--- a/headless/test/data/protocol/sanity/renderer-client-redirect-chain.js
+++ b/headless/test/data/protocol/sanity/renderer-client-redirect-chain.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: chained client redirection.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-content-security-policy.js b/headless/test/data/protocol/sanity/renderer-content-security-policy.js
index d16cc91..e05f463 100644
--- a/headless/test/data/protocol/sanity/renderer-content-security-policy.js
+++ b/headless/test/data/protocol/sanity/renderer-content-security-policy.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: content security policy.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-cookie-set-from-js-no-cookies.js b/headless/test/data/protocol/sanity/renderer-cookie-set-from-js-no-cookies.js
index 80cb243d..18900ae4 100644
--- a/headless/test/data/protocol/sanity/renderer-cookie-set-from-js-no-cookies.js
+++ b/headless/test/data/protocol/sanity/renderer-cookie-set-from-js-no-cookies.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: cookie set from js with cookies disabled.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-cookie-set-from-js.js b/headless/test/data/protocol/sanity/renderer-cookie-set-from-js.js
index 555e6bc..2c616396 100644
--- a/headless/test/data/protocol/sanity/renderer-cookie-set-from-js.js
+++ b/headless/test/data/protocol/sanity/renderer-cookie-set-from-js.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: cookie set from js.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-cookie-updated-from-js.js b/headless/test/data/protocol/sanity/renderer-cookie-updated-from-js.js
index 0b89453..5853275f 100644
--- a/headless/test/data/protocol/sanity/renderer-cookie-updated-from-js.js
+++ b/headless/test/data/protocol/sanity/renderer-cookie-updated-from-js.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: cookie updated from js.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-delayed-completion.js b/headless/test/data/protocol/sanity/renderer-delayed-completion.js
index 99e0582..61b3c3b0 100644
--- a/headless/test/data/protocol/sanity/renderer-delayed-completion.js
+++ b/headless/test/data/protocol/sanity/renderer-delayed-completion.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: delayed completion.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-double-redirect.js b/headless/test/data/protocol/sanity/renderer-double-redirect.js
index a2a4fba0..56453e3 100644
--- a/headless/test/data/protocol/sanity/renderer-double-redirect.js
+++ b/headless/test/data/protocol/sanity/renderer-double-redirect.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: double redirection.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-frame-load-events.js b/headless/test/data/protocol/sanity/renderer-frame-load-events.js
index 210f1e2..8b6d437 100644
--- a/headless/test/data/protocol/sanity/renderer-frame-load-events.js
+++ b/headless/test/data/protocol/sanity/renderer-frame-load-events.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: frame load events.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js
index b958d81..7780180 100644
--- a/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js
+++ b/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: frames redirection chain.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-hello-world.js b/headless/test/data/protocol/sanity/renderer-hello-world.js
index 1bae742..32a6c0d8 100644
--- a/headless/test/data/protocol/sanity/renderer-hello-world.js
+++ b/headless/test/data/protocol/sanity/renderer-hello-world.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: hello world.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js b/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js
index bacc5c42..5728cc7 100644
--- a/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js
+++ b/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: in cross origin object.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js b/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js
index c3f131d..ed37bf35 100644
--- a/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js
+++ b/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: verify JavaScript console errors reporting.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js
index 7970bd9..093d6b8 100644
--- a/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js
+++ b/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: mixed redirection chain.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-override-title-js-disabled.js b/headless/test/data/protocol/sanity/renderer-override-title-js-disabled.js
index 685027fd..62502a47b 100644
--- a/headless/test/data/protocol/sanity/renderer-override-title-js-disabled.js
+++ b/headless/test/data/protocol/sanity/renderer-override-title-js-disabled.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: override title with JavaScript disabled.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-override-title-js-enabled.js b/headless/test/data/protocol/sanity/renderer-override-title-js-enabled.js
index 05941b05..ac074b80 100644
--- a/headless/test/data/protocol/sanity/renderer-override-title-js-enabled.js
+++ b/headless/test/data/protocol/sanity/renderer-override-title-js-enabled.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: override title with JavaScript enabled.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js b/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js
index ac649d5..4f58aca 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect 303 put get.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js b/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js
index 786afc70..9dec57b 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirection 307 post method.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js b/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js
index 4ea4673..22ea1a4 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect 307 put method.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js b/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js
index 321ecf6..0acb87a 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirection after completion.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-base-url.js b/headless/test/data/protocol/sanity/renderer-redirect-base-url.js
index b2b594e..e4bc4113 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-base-url.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-base-url.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect base url.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js b/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js
index be8723e8..daf3fd0 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect empty url.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js b/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js
index fd8a6a1..7e00897 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect invalid url.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js b/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js
index fa7bde5..109b8a29 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect keeps fragment.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js b/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js
index f5424c5..0dda463 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect new fragment.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js b/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js
index cff1be1..0314bd3 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect non ascii url.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js b/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js
index 959f13fd..ccf8927f 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: post chain redirection.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js b/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js
index f732557c..44a144a 100644
--- a/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js
+++ b/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: redirect replaces fragment.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js
index 1f7fee6..ff8c169 100644
--- a/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js
+++ b/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: server redirection chain.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js b/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js
index 870e43b7..f096c25 100644
--- a/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js
+++ b/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: relative server redirection chain.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js b/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js
index 2382f82..ef30a83 100644
--- a/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js
+++ b/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: server redirection to failure.');
 
   let RendererTestHelper =
diff --git a/headless/test/data/protocol/sanity/renderer-window-location-fragments.js b/headless/test/data/protocol/sanity/renderer-window-location-fragments.js
index c5681875..49e90eac 100644
--- a/headless/test/data/protocol/sanity/renderer-window-location-fragments.js
+++ b/headless/test/data/protocol/sanity/renderer-window-location-fragments.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 (async function(testRunner) {
-  let {page, session, dp} = await testRunner.startBlank(
+  let {page, session, dp} = await testRunner.startWithFrameControl(
       'Tests renderer: window location fragments.');
 
   let RendererTestHelper =
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 49c648d..d285253 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -2390,6 +2390,7 @@
     }
     builders {
       mixins: "android-try"
+      mixins: "goma-j150"
       name: "android_compile_dbg"
       dimensions: "os:Ubuntu-14.04"
     }
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index 55318683..ccef7da1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> ንጥሎች</translation>
 <translation id="1491277525950327607">ቅንብርን ለመቀያየር ሁለቴ መታ ያድርጉ</translation>
 <translation id="152234381334907219">በጭራሽ አልተቀመጠም</translation>
-<translation id="1532451416480227577">አድራሻዎችን እና ክሬዲት ካርዶችን ከGoogle Pay አሳይ</translation>
 <translation id="1540800554400757039">አድራሻ 1</translation>
 <translation id="1545749641540134597">የኪውአር ኮድ ይቃኙ</translation>
 <translation id="1558704936695638228">ለተጨማሪ የትር አማራጮች ጫን ብለው ይያዙ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 4dc2982..c8be9bb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> من العناصر</translation>
 <translation id="1491277525950327607">انقر مرّتين لتبديل الإعداد</translation>
 <translation id="152234381334907219">لم يتم الحفظ مطلقًا</translation>
-<translation id="1532451416480227577">‏عرض العناوين وبطاقات الائتمان من Google Pay</translation>
 <translation id="1540800554400757039">العنوان 1</translation>
 <translation id="1545749641540134597">فحص رمز الاستجابة السريعة</translation>
 <translation id="1558704936695638228">يُرجى الضغط مع الاستمرار لعرض مزيد من خيارات علامة التبويب</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 9131b79..c218e7f0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> елемента</translation>
 <translation id="1491277525950327607">Докоснете двукратно за превключване на настройката</translation>
 <translation id="152234381334907219">Незапазвани никога</translation>
-<translation id="1532451416480227577">Показване на адресите и кредитните карти от Google Pay</translation>
 <translation id="1540800554400757039">Адрес 1</translation>
 <translation id="1545749641540134597">Сканирайте код за бърза реакция</translation>
 <translation id="1558704936695638228">Натиснете и задръжте, за да видите още опции за раздела</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index 320380c..6bb61d5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -36,7 +36,6 @@
 <translation id="145015347812617860"><ph name="COUNT" />টি আইটেম</translation>
 <translation id="1491277525950327607">সেটিং টগল করতে দুবার আলতো চাপুন</translation>
 <translation id="152234381334907219">কখনও সংরক্ষিত হয়নি</translation>
-<translation id="1532451416480227577">Google Pay তে সেভ থাকা ঠিকানা এবং ক্রেডিট কার্ডগুলি দেখুন</translation>
 <translation id="1540800554400757039">ঠিকানা ১</translation>
 <translation id="1545749641540134597">QR কোড স্ক্যান করুন</translation>
 <translation id="1580783302095112590">মেল পাঠানো হয়েছে৷</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index adfcffd8..dcd30bc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elements</translation>
 <translation id="1491277525950327607">Fes doble toc per canviar la configuració</translation>
 <translation id="152234381334907219">Contrasenyes que no es desen mai</translation>
-<translation id="1532451416480227577">Mostra les adreces i les targetes de crèdit de Google Pay</translation>
 <translation id="1540800554400757039">Adreça 1</translation>
 <translation id="1545749641540134597">Escaneja el codi QR</translation>
 <translation id="1558704936695638228">Mantén premut el botó per veure més opcions de les pestanyes</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 28edfba..95e0024c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Počet položek: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Nastavení můžete přepnout dvojitým klepnutím</translation>
 <translation id="152234381334907219">Neuloženo</translation>
-<translation id="1532451416480227577">Zobrazit adresy a karty ze služby Google Pay</translation>
 <translation id="1540800554400757039">První řádek adresy</translation>
 <translation id="1545749641540134597">Naskenovat QR kód</translation>
 <translation id="1558704936695638228">Podržením zobrazíte další možnosti karet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index f5592ea..06221b3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elementer</translation>
 <translation id="1491277525950327607">Tryk to gange for at skifte indstilling</translation>
 <translation id="152234381334907219">Aldrig gemt</translation>
-<translation id="1532451416480227577">Se adresser og kreditkort fra Google Pay</translation>
 <translation id="1540800554400757039">Adresse 1</translation>
 <translation id="1545749641540134597">Scan QR-kode</translation>
 <translation id="1558704936695638228">Hold fingeren nede for at se flere fanemuligheder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index a912090..edb1f7b4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> Elemente</translation>
 <translation id="1491277525950327607">Zum Aktivieren bzw. Deaktivieren doppeltippen</translation>
 <translation id="152234381334907219">Nie speichern für...</translation>
-<translation id="1532451416480227577">Adressen und Kreditkarten aus Google Pay anzeigen</translation>
 <translation id="1540800554400757039">Adresse 1</translation>
 <translation id="1545749641540134597">QR-Code scannen</translation>
 <translation id="1558704936695638228">Für weitere Tab-Optionen gedrückt halten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 84002de..7395ec7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> στοιχεία</translation>
 <translation id="1491277525950327607">Πατήστε δύο φορές για εναλλαγή της ρύθμισης</translation>
 <translation id="152234381334907219">Δεν έγινε ποτέ αποθήκευση</translation>
-<translation id="1532451416480227577">Εμφάνιση διευθύνσεων και καρτών από Google Pay</translation>
 <translation id="1540800554400757039">Διεύθυνση 1</translation>
 <translation id="1545749641540134597">Σάρωση κωδικού QR</translation>
 <translation id="1558704936695638228">Πατήστε παρατεταμένα για περισσότερες επιλογές καρτέλας</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 1fe8bea..2fdc75b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> items</translation>
 <translation id="1491277525950327607">Double tap to toggle setting</translation>
 <translation id="152234381334907219">Never Saved</translation>
-<translation id="1532451416480227577">Show addresses and credit cards from Google Pay</translation>
 <translation id="1540800554400757039">Address 1</translation>
 <translation id="1545749641540134597">Scan QR Code</translation>
 <translation id="1558704936695638228">Press and hold for more tab options</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
index fff4d35..60fae6e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elementos</translation>
 <translation id="1491277525950327607">Presiona dos veces para activar o desactivar la configuración</translation>
 <translation id="152234381334907219">Nunca guardado</translation>
-<translation id="1532451416480227577">Mostrar las direcciones y las tarjetas de crédito de Google Pay</translation>
 <translation id="1540800554400757039">Dirección 1</translation>
 <translation id="1545749641540134597">Escanear código QR</translation>
 <translation id="1558704936695638228">Mantén presionado el botón para obtener más opciones de pestañas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index b2cad425..d170442 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elementos</translation>
 <translation id="1491277525950327607">Toca dos veces para activar o desactivar esta opción</translation>
 <translation id="152234381334907219">Contraseñas que nunca se guardan</translation>
-<translation id="1532451416480227577">Mostrar direcciones y tarjetas crédito de Google Pay</translation>
 <translation id="1540800554400757039">Dirección 1</translation>
 <translation id="1545749641540134597">Escanea el código QR</translation>
 <translation id="1558704936695638228">Mantén pulsado para ver más opciones de las pestañas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 9b3aef1..bac44aa 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> üksust</translation>
 <translation id="1491277525950327607">Seade vahetamiseks topeltpuudutage</translation>
 <translation id="152234381334907219">Ei ole kunagi salvestatud</translation>
-<translation id="1532451416480227577">Kuva aadressid ja krediitkaardid Google Payst</translation>
 <translation id="1540800554400757039">Aadress 1</translation>
 <translation id="1545749641540134597">QR-koodi skannimine</translation>
 <translation id="1558704936695638228">Vahelehe lisavalikute nägemiseks vajutage pikalt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index ce9be7c7..b070c408e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -23,6 +23,7 @@
 <translation id="127138278192656016">استفاده از همگام‌سازی و همه سرویس‌ها</translation>
 <translation id="1272079795634619415">توقف</translation>
 <translation id="1323735185997015385">حذف</translation>
+<translation id="132390688737681464">ذخیره و تکمیل نشانی</translation>
 <translation id="132683371494960526">برای تغییر پوشه والد دو ضربه سریع بزنید.</translation>
 <translation id="1340643665687018190">بستن منو</translation>
 <translation id="1375321115329958930">رمزهای ورود ذخیره شده</translation>
@@ -36,9 +37,9 @@
 <translation id="145015347812617860"><ph name="COUNT" /> مورد</translation>
 <translation id="1491277525950327607">برای جابه‌جایی بین تنظیمات، دو ضربه سریع بزنید</translation>
 <translation id="152234381334907219">هرگز ذخیره نمی‌شود</translation>
-<translation id="1532451416480227577">‏نمایش نشانی‌ها و کارت‌های اعتباری از Google Pay</translation>
 <translation id="1540800554400757039">آدرس ۱</translation>
 <translation id="1545749641540134597">‏اسکن کد QR</translation>
+<translation id="1558704936695638228">برای گزینه‌های بیشتر برگه، فشار دهید و نگه دارید</translation>
 <translation id="1580783302095112590">نامه ارسال شد.</translation>
 <translation id="1582732959743469162">با این کار کل پیشرفت بارگیری کنونی‌تان متوقف خواهد شد.</translation>
 <translation id="1605658421715042784">کپی تصویر</translation>
@@ -240,6 +241,7 @@
 <translation id="5062321486222145940">‏نصب Google Drive</translation>
 <translation id="5083464117946352670">تعیین اندازه فایل ممکن نیست.</translation>
 <translation id="5094827893301452931">‏Tweet انجام شد.</translation>
+<translation id="5123982333065001601">ذخیره و تکمیل کارت اعتباری</translation>
 <translation id="5173593619615111996">بستن برگه‌های حالت ناشناس</translation>
 <translation id="5181140330217080051">در حال بارگیری</translation>
 <translation id="5186185447130319458">خصوصی</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index f8cff6c..9f9f303b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> kohdetta</translation>
 <translation id="1491277525950327607">Muuta asetusta kaksoisnapauttamalla.</translation>
 <translation id="152234381334907219">Tallentamaton</translation>
-<translation id="1532451416480227577">Näytä osoitteet ja luottokortit Google Paysta</translation>
 <translation id="1540800554400757039">Osoite 1</translation>
 <translation id="1545749641540134597">Skannaa QR-koodi</translation>
 <translation id="1558704936695638228">Näytä lisää välilehtiasetuksia painamalla pitkään</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index bb95103..ed40636 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> (na) item</translation>
 <translation id="1491277525950327607">I-double tap upang i-toggle ang setting</translation>
 <translation id="152234381334907219">Hindi Kailanman Na-save</translation>
-<translation id="1532451416480227577">Ipakita ang mga address at credit card mula sa Google Pay</translation>
 <translation id="1540800554400757039">Address 1</translation>
 <translation id="1545749641540134597">I-scan ang QR Code</translation>
 <translation id="1558704936695638228">Pindutin nang matagal para sa higit pang opsyon sa tab</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 9b2392b..aec86f5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -36,7 +36,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> éléments</translation>
 <translation id="1491277525950327607">Appuyer deux fois pour activer/désactiver le paramètre</translation>
 <translation id="152234381334907219">Jamais enregistrés</translation>
-<translation id="1532451416480227577">Afficher adresses/cartes de crédit de Google Pay</translation>
 <translation id="1540800554400757039">Adresse 1</translation>
 <translation id="1545749641540134597">Scanner le code QR</translation>
 <translation id="1580783302095112590">E-mail envoyé.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 6cd11b07..3d8633f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> આઇટમ્સ</translation>
 <translation id="1491277525950327607">સેટિંગ ટૉગલ કરવા માટે બે વાર ટૅપ કરો</translation>
 <translation id="152234381334907219">ક્યારેય ન સચવાયેલું</translation>
-<translation id="1532451416480227577">Google Pay માંથી સરનામાં અને ક્રેડિટ કાર્ડ બતાવો</translation>
 <translation id="1540800554400757039">સરનામું 1</translation>
 <translation id="1545749641540134597">QR કોડ સ્કેન કરો</translation>
 <translation id="1558704936695638228">વધુ ટૅબ વિકલ્પો માટે દબાવી રાખો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 01f1c15..81a4438 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> आइटम</translation>
 <translation id="1491277525950327607">सेटिंग को टॉगल करने के लिए डबल टैप करें</translation>
 <translation id="152234381334907219">कभी नहीं सहेजा गया</translation>
-<translation id="1532451416480227577">Google Pay से पते और क्रेडिट कार्ड दिखाएं</translation>
 <translation id="1540800554400757039">पता 1</translation>
 <translation id="1545749641540134597">QR कोड स्कैन करें</translation>
 <translation id="1558704936695638228">टैब के और विकल्प देखने के लिए दबाकर रखें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 6974250a..3ed60bc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Broj stavki: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Dodirnite dvaput da biste promijenili postavku</translation>
 <translation id="152234381334907219">Nikad spremljeno</translation>
-<translation id="1532451416480227577">Prikaži adrese i kreditne kartice s Google Paya</translation>
 <translation id="1540800554400757039">1. adresni redak</translation>
 <translation id="1545749641540134597">Skeniranje QR koda</translation>
 <translation id="1558704936695638228">Pritisnite i zadržite za više opcija za karticu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index f90a6a4..a863273 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elem</translation>
 <translation id="1491277525950327607">A beállítás módosításához koppintson duplán</translation>
 <translation id="152234381334907219">Soha nem került mentésre</translation>
-<translation id="1532451416480227577">Címek és hitelkártyák mutatása a Google Payből</translation>
 <translation id="1540800554400757039">Cím 1. sora</translation>
 <translation id="1545749641540134597">QR-kód beolvasása</translation>
 <translation id="1558704936695638228">Nyomva tartva további lapbeállításokat láthat</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index cc787f6..a68bfe4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> item</translation>
 <translation id="1491277525950327607">Tap dua kali untuk beralih setelan</translation>
 <translation id="152234381334907219">Jangan Pernah Disimpan</translation>
-<translation id="1532451416480227577">Tampilkan alamat dan kartu kredit dari Google Pay</translation>
 <translation id="1540800554400757039">Alamat 1</translation>
 <translation id="1545749641540134597">Pindai Kode QR</translation>
 <translation id="1558704936695638228">Tekan dan tahan untuk menampilkan opsi tab lainnya</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 402105ff..95f2df08 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elementi</translation>
 <translation id="1491277525950327607">Tocca due volte per attivare/disattivare l'impostazione</translation>
 <translation id="152234381334907219">Mai salvate</translation>
-<translation id="1532451416480227577">Mostra indirizzi e carte di credito di Google Pay</translation>
 <translation id="1540800554400757039">Indirizzo 1</translation>
 <translation id="1545749641540134597">Leggi il codice QR</translation>
 <translation id="1558704936695638228">Tieni premuto per vedere maggiori opzioni sulla scheda</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 2b0e3c6..8a45742 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> פריטים</translation>
 <translation id="1491277525950327607">הקש פעמיים כדי להחליף את מצב ההגדרה</translation>
 <translation id="152234381334907219">פריטים שאף פעם לא נשמרו</translation>
-<translation id="1532451416480227577">‏הצגת כתובות וכרטיסי אשראי מ-Google Pay</translation>
 <translation id="1540800554400757039">כתובת, שורה 1</translation>
 <translation id="1545749641540134597">‏סריקת קוד QR</translation>
 <translation id="1558704936695638228">לחיצה ארוכה תציג עוד אפשרויות כרטיסייה</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 1947276..f653f523 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" />個のアイテム</translation>
 <translation id="1491277525950327607">設定を切り替えるにはダブルタップします</translation>
 <translation id="152234381334907219">常に保存しない</translation>
-<translation id="1532451416480227577">Google Pay に保存されている住所とクレジット カードの情報を表示する</translation>
 <translation id="1540800554400757039">住所1行目</translation>
 <translation id="1545749641540134597">QR コードをスキャンします</translation>
 <translation id="1558704936695638228">押し続けて他のタブオプションを見る</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 08e165d3..6d226193 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> ಐಟಂಗಳು</translation>
 <translation id="1491277525950327607">ಸೆಟ್ಟಿಂಗ್‌ ಟಾಗಲ್‌ ಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ</translation>
 <translation id="152234381334907219">ಎಂದಿಗೂ ಉಳಿಸಿಲ್ಲ</translation>
-<translation id="1532451416480227577">Google Pay ನಿಂದ ವಿಳಾಸಗಳು ಮತ್ತು ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="1540800554400757039">ವಿಳಾಸ 1</translation>
 <translation id="1545749641540134597">QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation>
 <translation id="1558704936695638228">ಹೆಚ್ಚಿನ ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗೆ ಬಟನ್ ಅನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index c9c91bd..68f7384 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">항목 <ph name="COUNT" />개</translation>
 <translation id="1491277525950327607">설정을 전환하려면 두 번 탭하세요.</translation>
 <translation id="152234381334907219">저장되지 않음</translation>
-<translation id="1532451416480227577">Google Pay에 저장된 주소와 신용카드 표시</translation>
 <translation id="1540800554400757039">주소 1</translation>
 <translation id="1545749641540134597">QR 코드 스캔</translation>
 <translation id="1558704936695638228">더 많은 탭 옵션을 보려면 길게 누르세요.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 8a56eb61..def58c3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Elementų: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Dukart palieskite, kad perjungtumėte nustatymą</translation>
 <translation id="152234381334907219">Niekada neišsaugota</translation>
-<translation id="1532451416480227577">Rodyti „Google Pay“ adresus ir kredito korteles</translation>
 <translation id="1540800554400757039">1 adreso eil.</translation>
 <translation id="1545749641540134597">Nuskaitykite QR kodą</translation>
 <translation id="1558704936695638228">Paspauskite ir palaikykite, kad būtų pateikta daugiau skirtukų parinkčių</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 31d8ba4..cfb0c8d4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> vienumi</translation>
 <translation id="1491277525950327607">Veiciet dubultskārienu, lai pārslēgtu iestatījumu.</translation>
 <translation id="152234381334907219">Jaunākie saglabātie</translation>
-<translation id="1532451416480227577">Rādīt adreses un kredītkartes no pakalpojuma Google Pay</translation>
 <translation id="1540800554400757039">1. adrese</translation>
 <translation id="1545749641540134597">Skenējiet QR kodu</translation>
 <translation id="1558704936695638228">Lai atvērtu citas ciļņu opcijas, nospiediet un turiet.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 8b56d286..cb70cef9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> ഇനങ്ങൾ</translation>
 <translation id="1491277525950327607">ക്രമീകരണം മാറ്റാൻ രണ്ടുതവണ ടാപ്പുചെയ്യുക</translation>
 <translation id="152234381334907219">ഒരിക്കലും സംരക്ഷിച്ചില്ല</translation>
-<translation id="1532451416480227577">Google Pay-യിൽ നിന്നുള്ള വിലാസങ്ങളും ക്രെഡിറ്റ് കാർഡുകളും കാണിക്കുക</translation>
 <translation id="1540800554400757039">വിലാസം 1</translation>
 <translation id="1545749641540134597">QR കോഡ് സ്‌കാൻ ചെയ്യുക</translation>
 <translation id="1558704936695638228">കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി അമർത്തിപ്പിടിക്കുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 681e8b9..46d8afc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> आयटम</translation>
 <translation id="1491277525950327607">सेटिंग टॉगल करण्यासाठी दोनदा टॅप करा</translation>
 <translation id="152234381334907219">कधीही सेव्ह न केलेले</translation>
-<translation id="1532451416480227577">Google Pay वरील पत्ते आणि क्रेडिट कार्ड दाखवा</translation>
 <translation id="1540800554400757039">पत्ता 1</translation>
 <translation id="1545749641540134597">QR कोड स्कॅन करा</translation>
 <translation id="1558704936695638228">अधिक टॅब पर्यायांसाठी दाबा आणि धरून ठेवा</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index f1b5621..c157836 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> item</translation>
 <translation id="1491277525950327607">Dwiketik untuk togol tetapan</translation>
 <translation id="152234381334907219">Tidak Pernah Disimpan</translation>
-<translation id="1532451416480227577">Tunjukkan alamat dan kad kredit daripada Google Pay</translation>
 <translation id="1540800554400757039">Alamat 1</translation>
 <translation id="1545749641540134597">Imbas Kod QR</translation>
 <translation id="1558704936695638228">Tekan dan tahan untuk mendapatkan lagi pilihan tab</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index a64da09cd..92be600b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> items</translation>
 <translation id="1491277525950327607">Dubbeltik om de instelling in of uit te schakelen</translation>
 <translation id="152234381334907219">Nooit opgeslagen</translation>
-<translation id="1532451416480227577">Adressen en creditcards uit Google Pay weergeven</translation>
 <translation id="1540800554400757039">Adres 1</translation>
 <translation id="1545749641540134597">QR-code scannen</translation>
 <translation id="1558704936695638228">Druk hierop en houd dit vast voor meer opties voor tabbladen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 4882608..73c820a2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -23,6 +23,7 @@
 <translation id="127138278192656016">Bruk synkronisering og alle tjenester</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1323735185997015385">Slett</translation>
+<translation id="132390688737681464">Lagre og fyll inn adresser</translation>
 <translation id="132683371494960526">Dobbelttrykk for å bytte overordnet mappe.</translation>
 <translation id="1340643665687018190">Lukk menyen</translation>
 <translation id="1375321115329958930">Lagrede passord</translation>
@@ -36,9 +37,9 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elementer</translation>
 <translation id="1491277525950327607">Dobbelttrykk for å slå innstillingen av/på</translation>
 <translation id="152234381334907219">Aldri lagret</translation>
-<translation id="1532451416480227577">Vis adresser og kredittkort fra Google Pay</translation>
 <translation id="1540800554400757039">Adresse 1</translation>
 <translation id="1545749641540134597">Skann en QR-kode</translation>
+<translation id="1558704936695638228">Trykk og hold for flere fanealternativer</translation>
 <translation id="1580783302095112590">E-posten er sendt.</translation>
 <translation id="1582732959743469162">Dette stopper all fremdriften for den aktive nedlastingen.</translation>
 <translation id="1605658421715042784">Kopiér bildet</translation>
@@ -239,6 +240,7 @@
 <translation id="5062321486222145940">Installer Google Disk</translation>
 <translation id="5083464117946352670">Kan ikke fastslå filstørrelsen.</translation>
 <translation id="5094827893301452931">Twitter-meldingen er fullført.</translation>
+<translation id="5123982333065001601">Lagre og fyll inn kredittkort</translation>
 <translation id="5173593619615111996">Lukk alle inkognitofaner</translation>
 <translation id="5181140330217080051">Laster ned</translation>
 <translation id="5186185447130319458">Privat</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index dc153f9..ac44300 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Elementy: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Kliknij dwukrotnie, by zmienić ustawienie</translation>
 <translation id="152234381334907219">Nigdy nie zapisane</translation>
-<translation id="1532451416480227577">Pokaż adresy i karty kredytowe z Google Pay</translation>
 <translation id="1540800554400757039">Adres 1</translation>
 <translation id="1545749641540134597">Zeskanuj kod QR</translation>
 <translation id="1558704936695638228">Naciśnij i przytrzymaj, by wyświetlić więcej opcji kart</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index 94f237a0..3e73512 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> itens</translation>
 <translation id="1491277525950327607">Toque duas vezes para alternar a configuração</translation>
 <translation id="152234381334907219">Nunca salvas</translation>
-<translation id="1532451416480227577">Mostrar endereços e cartões de crédito do Google Pay</translation>
 <translation id="1540800554400757039">Endereço 1</translation>
 <translation id="1545749641540134597">Ler código QR</translation>
 <translation id="1558704936695638228">Toque e mantenha pressionado para ver mais opções da guia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index 8ad2e326..3907d96b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> itens</translation>
 <translation id="1491277525950327607">Toque duas vezes para ativar ou desativar a definição</translation>
 <translation id="152234381334907219">Nunca guardado</translation>
-<translation id="1532451416480227577">Mostrar endereços e cartões de crédito do Google Pay</translation>
 <translation id="1540800554400757039">Morada 1</translation>
 <translation id="1545749641540134597">Ler código QR</translation>
 <translation id="1558704936695638228">Prima sem soltar para obter mais opções de separadores.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 956b8fc..e7c066e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> elemente</translation>
 <translation id="1491277525950327607">Atinge de două ori ca să comuți setarea</translation>
 <translation id="152234381334907219">Nu se salvează niciodată</translation>
-<translation id="1532451416480227577">Afișează adresele și cardurile de credit din Google Pay</translation>
 <translation id="1540800554400757039">Adresă 1</translation>
 <translation id="1545749641540134597">Scanează codul QR</translation>
 <translation id="1558704936695638228">Apasă lung pentru mai multe opțiuni de file</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 934d565..f5f36a10 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -23,6 +23,7 @@
 <translation id="127138278192656016">Включить синхронизацию и все сервисы Chrome</translation>
 <translation id="1272079795634619415">Остановить</translation>
 <translation id="1323735185997015385">Удалить</translation>
+<translation id="132390688737681464">Сохранять и автоматически подставлять адреса</translation>
 <translation id="132683371494960526">Чтобы изменить родительскую папку, нажмите дважды.</translation>
 <translation id="1340643665687018190">Закрыть меню</translation>
 <translation id="1375321115329958930">Сайты с сохраненными паролями</translation>
@@ -36,9 +37,9 @@
 <translation id="145015347812617860">Закладок: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Для переключения нажмите дважды</translation>
 <translation id="152234381334907219">Сайты, пароли для которых не сохраняются</translation>
-<translation id="1532451416480227577">Показывать адреса и кредитные карты из Google Pay</translation>
 <translation id="1540800554400757039">Адрес, строка 1</translation>
 <translation id="1545749641540134597">Сканирование QR-кода</translation>
+<translation id="1558704936695638228">Нажмите и удерживайте, чтобы открыть дополнительные настройки вкладки</translation>
 <translation id="1580783302095112590">Сообщение отправлено.</translation>
 <translation id="1582732959743469162">Скачивание файлов будет приостановлено.</translation>
 <translation id="1605658421715042784">Копировать изображение</translation>
@@ -239,6 +240,7 @@
 <translation id="5062321486222145940">Установить Google Диск</translation>
 <translation id="5083464117946352670">Не установлен размер файла</translation>
 <translation id="5094827893301452931">Опубликовано в Твиттере.</translation>
+<translation id="5123982333065001601">Сохранять и автоматически подставлять данные кредитных карт</translation>
 <translation id="5173593619615111996">Закр. вкладки инкогнито</translation>
 <translation id="5181140330217080051">Скачивается</translation>
 <translation id="5186185447130319458">Конфиденциально</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index b84240d..8cdf203 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Počet položiek: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Nastavenie môžete prepnúť dvojitým klepnutím</translation>
 <translation id="152234381334907219">Neuložené</translation>
-<translation id="1532451416480227577">Zobraziť adresy a kreditné karty zo služby Google Pay</translation>
 <translation id="1540800554400757039">Adresa 1</translation>
 <translation id="1545749641540134597">Naskenovať kód QR</translation>
 <translation id="1558704936695638228">Pridržaním zobrazíte ďalšie možnosti karty</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 4bed1bc4..097cec68 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Št. elementov: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Dvakrat se dotaknite, da preklopite nastavitev</translation>
 <translation id="152234381334907219">Nikoli shranjeno</translation>
-<translation id="1532451416480227577">Prikaži naslove in kreditne kartice iz Googla Pay</translation>
 <translation id="1540800554400757039">Naslov 1</translation>
 <translation id="1545749641540134597">Scan QR Code</translation>
 <translation id="1558704936695638228">Pridržite za več možnosti zavihkov</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index c9ecce1..eca43943 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Ставки: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Двапут додирните да бисте укључили/искључили подешавање</translation>
 <translation id="152234381334907219">Никада се не чува</translation>
-<translation id="1532451416480227577">Приказуј адресе и кредитне картице из Google Pay-а</translation>
 <translation id="1540800554400757039">1. ред за адресу</translation>
 <translation id="1545749641540134597">Скенирајте QR кôд</translation>
 <translation id="1558704936695638228">Press and hold for more tab options (Притисните и задржите ако желите више опција за картице)</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 05764bf5..f4b8324d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> objekt</translation>
 <translation id="1491277525950327607">Aktivera eller inaktivera inställningen genom att trycka snabbt två gånger</translation>
 <translation id="152234381334907219">Aldrig sparat</translation>
-<translation id="1532451416480227577">Visa adresser och kreditkort från Google Pay</translation>
 <translation id="1540800554400757039">Adressrad 1</translation>
 <translation id="1545749641540134597">Skanna QR-kod</translation>
 <translation id="1558704936695638228">Tryck länge för fler flikalternativ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 0059c9e..7558e6d6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Vipengee <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Gusa mara mbili ili ugeuze mipangilio</translation>
 <translation id="152234381334907219">Hayatahifadhiwa Kamwe</translation>
-<translation id="1532451416480227577">Onyesha anwani na kadi za malipo kutoka Google Pay</translation>
 <translation id="1540800554400757039">Anwani ya 1</translation>
 <translation id="1545749641540134597">Changanua Msimbo wa QR</translation>
 <translation id="1558704936695638228">Bonyeza na ushikilie ili uone chaguo zingine za kichupo</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index 9fa0cadf..513c1315 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> உருப்படிகள்</translation>
 <translation id="1491277525950327607">அமைப்பை நிலைமாற்ற, இருமுறை தட்டவும்</translation>
 <translation id="152234381334907219">எப்போதும் சேமிக்காதவை</translation>
-<translation id="1532451416480227577">Google Pay இல் உள்ள முகவரிகளையும் கிரெடிட் கார்டுகளையும் காட்டு</translation>
 <translation id="1540800554400757039">முகவரி 1</translation>
 <translation id="1545749641540134597">QR குறியீட்டை ஸ்கேன் செய்க</translation>
 <translation id="1558704936695638228">மேலும் தாவல் விருப்பத்தேர்வுகளைப் பார்க்க, அழுத்திப் பிடித்திருக்கவும்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 348d253..564b99b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -36,7 +36,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> అంశాలు</translation>
 <translation id="1491277525950327607">సెట్టింగ్‌ను టోగుల్ చేయడానికి రెండుసార్లు నొక్కండి</translation>
 <translation id="152234381334907219">ఎప్పటికి సేవ్ చెయ్యబడవు</translation>
-<translation id="1532451416480227577">Google Payలోని చిరునామాలు మరియు క్రెడిట్ కార్డ్‌లను చూపు</translation>
 <translation id="1540800554400757039">చిరునామా 1</translation>
 <translation id="1545749641540134597">QR కోడ్‌ని స్కాన్ చేయండి</translation>
 <translation id="1580783302095112590">మెయిల్ పంపబడింది.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index e34f59e..3519325 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> รายการ</translation>
 <translation id="1491277525950327607">แตะ 2 ครั้งเพื่อสลับการตั้งค่า</translation>
 <translation id="152234381334907219">ไม่เคยบันทึก</translation>
-<translation id="1532451416480227577">แสดงที่อยู่และบัตรเครดิตจาก Google Pay</translation>
 <translation id="1540800554400757039">ที่อยู่ 1</translation>
 <translation id="1545749641540134597">สแกนโค้ด QR</translation>
 <translation id="1558704936695638228">กดค้างไว้เพื่อดูตัวเลือกแท็บอื่นๆ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index bb1ba76..fc24cdb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> öğe</translation>
 <translation id="1491277525950327607">Ayarı açıp kapatmak için iki kez dokunun</translation>
 <translation id="152234381334907219">Hiç Kaydedilmeyenler</translation>
-<translation id="1532451416480227577">Google Pay'deki adresleri ve kredi kartlarını göster</translation>
 <translation id="1540800554400757039">Adres 1</translation>
 <translation id="1545749641540134597">QR Kodunu Tara</translation>
 <translation id="1558704936695638228">Diğer sekme seçenekleri için basılı tutun</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index cd7fab9..076a820 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">Закладок: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Двічі торкніться, щоб змінити налаштування</translation>
 <translation id="152234381334907219">Ніколи не зберігалося</translation>
-<translation id="1532451416480227577">Показувати адреси й дані кредитних карток із Google Pay</translation>
 <translation id="1540800554400757039">Адреса 1</translation>
 <translation id="1545749641540134597">Сканувати QR-код</translation>
 <translation id="1558704936695638228">Утримуйте, щоб відкрити більше параметрів вкладок</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 036450f..9af3048 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> mục</translation>
 <translation id="1491277525950327607">Nhấn đúp để chuyển đổi cài đặt</translation>
 <translation id="152234381334907219">Không bao giờ lưu</translation>
-<translation id="1532451416480227577">Hiển thị địa chỉ và thẻ tín dụng từ Google Pay</translation>
 <translation id="1540800554400757039">Địa chỉ 1</translation>
 <translation id="1545749641540134597">Quét mã QR</translation>
 <translation id="1558704936695638228">Nhấn và giữ để có thêm các tùy chọn tab</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 6ff5381..9daff0c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860">有<ph name="COUNT" />个书签</translation>
 <translation id="1491277525950327607">点按两次即可切换设置</translation>
 <translation id="152234381334907219">一律不保存</translation>
-<translation id="1532451416480227577">显示存储在 Google Pay 中的地址和信用卡信息</translation>
 <translation id="1540800554400757039">地址第1行</translation>
 <translation id="1545749641540134597">扫描 QR 码</translation>
 <translation id="1558704936695638228">按住可查看更多标签选项</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 2bbfc7f..be29ec81 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -37,7 +37,6 @@
 <translation id="145015347812617860"><ph name="COUNT" /> 個項目</translation>
 <translation id="1491277525950327607">輕觸兩下即可切換設定</translation>
 <translation id="152234381334907219">永不儲存</translation>
-<translation id="1532451416480227577">顯示 Google Pay 中儲存的地址和信用卡資訊</translation>
 <translation id="1540800554400757039">地址 1</translation>
 <translation id="1545749641540134597">掃描 QR 圖碼</translation>
 <translation id="1558704936695638228">按住即可查看更多分頁選項</translation>
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
index 000d610f..06bf8aa 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
@@ -305,14 +305,6 @@
   return NO;
 }
 
-#pragma mark - UIScrollViewDelegate
-
-- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView*)scrollView {
-  // Adjust Content Inset changed. Force a re-layout of the CollectionView to
-  // visualize changes.
-  [self.collectionView.collectionViewLayout invalidateLayout];
-}
-
 #pragma mark - GridCellDelegate
 
 - (void)closeButtonTappedForCell:(GridCell*)cell {
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
index fa2bdb6..0aa5d8f5 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -180,8 +180,14 @@
 - (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.initialFrame = self.view.frame;
-  [self modifyChildViewControllerInsetsAndScrollViewOffets];
-  [self updatePageViewAccessibilityVisibility];
+  // Modify Remote Tabs Insets when page appears and during rotation.
+  [self setInsetForRemoteTabs];
+}
+
+- (void)viewDidLayoutSubviews {
+  [super viewDidLayoutSubviews];
+  // Modify Incognito and Regular Tabs Insets
+  [self setInsetForGridViews];
 }
 
 - (void)viewWillDisappear:(BOOL)animated {
@@ -210,7 +216,8 @@
   };
   auto completion =
       ^(id<UIViewControllerTransitionCoordinatorContext> context) {
-        [self modifyChildViewControllerInsetsAndScrollViewOffets];
+        // Modify Remote Tabs Insets when page appears and during rotation.
+        [self setInsetForRemoteTabs];
       };
   [coordinator animateAlongsideTransition:animate completion:completion];
 }
@@ -357,9 +364,9 @@
 
 #pragma mark - Private
 
-// Updates the scroll view's offset by calling setter of _currentPage. Updates
-// the insets for the Grid ViewControllers and Remote Tabs.
-- (void)modifyChildViewControllerInsetsAndScrollViewOffets {
+// Sets the proper insets for the Remote Tabs ViewController to accomodate for
+// the safe area, toolbar, and status bar.
+- (void)setInsetForRemoteTabs {
   // Call the current page setter to sync the scroll view offset to the current
   // page value, if the scroll view isn't scrolling. Don't animate this.
   if (!self.scrollView.dragging && !self.scrollView.decelerating) {
@@ -370,26 +377,21 @@
   CGFloat bottomInset = self.configuration == TabGridConfigurationBottomToolbar
                             ? self.bottomToolbar.intrinsicContentSize.height
                             : 0;
-  UIEdgeInsets contentInset = UIEdgeInsetsMake(
+  UIEdgeInsets inset = UIEdgeInsetsMake(
       self.topToolbar.intrinsicContentSize.height, 0, bottomInset, 0);
-
-  [self setInsetForRemoteTabs:contentInset];
-  [self setInsetForGridViews:contentInset];
-}
-
-// Sets the proper insets for the Remote Tabs ViewController to accomodate for
-// the safe area, toolbar, and status bar.
-- (void)setInsetForRemoteTabs:(UIEdgeInsets)inset {
   if (@available(iOS 11, *)) {
     // Left and right side could be missing correct safe area
     // inset upon rotation. Manually correct it.
     self.remoteTabsViewController.additionalSafeAreaInsets = UIEdgeInsetsZero;
     UIEdgeInsets additionalSafeArea = inset;
     UIEdgeInsets safeArea = self.scrollView.safeAreaInsets;
-    UIEdgeInsets remoteTabsSafeArea =
-        self.remoteTabsViewController.tableView.safeAreaInsets;
-    additionalSafeArea.right += safeArea.right - remoteTabsSafeArea.right;
-    additionalSafeArea.left += safeArea.left - remoteTabsSafeArea.left;
+    // If Remote Tabs isn't on the screen, it will not have the right safe area
+    // insets. Pass down the safe area insets of the scroll view.
+    if (self.currentPage != TabGridPageRemoteTabs) {
+      additionalSafeArea.right = safeArea.right;
+      additionalSafeArea.left = safeArea.left;
+    }
+
     // Ensure that the View Controller doesn't have safe area inset that already
     // covers the view's bounds.
     DCHECK(!CGRectIsEmpty(UIEdgeInsetsInsetRect(
@@ -405,7 +407,19 @@
 
 // Sets the proper insets for the Grid ViewControllers to accomodate for the
 // safe area and toolbar.
-- (void)setInsetForGridViews:(UIEdgeInsets)inset {
+- (void)setInsetForGridViews {
+  // Call the current page setter to sync the scroll view offset to the current
+  // page value, if the scroll view isn't scrolling. Don't animate this.
+  if (!self.scrollView.dragging && !self.scrollView.decelerating) {
+    self.currentPage = _currentPage;
+  }
+  // The content inset of the tab grids must be modified so that the toolbars
+  // do not obscure the tabs. This may change depending on orientation.
+  CGFloat bottomInset = self.configuration == TabGridConfigurationBottomToolbar
+                            ? self.bottomToolbar.intrinsicContentSize.height
+                            : 0;
+  UIEdgeInsets inset = UIEdgeInsetsMake(
+      self.topToolbar.intrinsicContentSize.height, 0, bottomInset, 0);
   if (@available(iOS 11, *)) {
     inset.left = self.scrollView.safeAreaInsets.left;
     inset.right = self.scrollView.safeAreaInsets.right;
@@ -601,32 +615,20 @@
   RecentTabsTableViewController* viewController = self.remoteTabsViewController;
   viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
   [self addChildViewController:viewController];
-  // Inserting RecentTabs into a UIView helps prevent safe area unpredictability
-  // for the TableView when doing inset calculations in -setInsetForRemoteTabs.
-  UIView* parentView = [[UIView alloc] init];
-  parentView.translatesAutoresizingMaskIntoConstraints = NO;
-  [parentView addSubview:viewController.view];
-  [contentView addSubview:parentView];
+  [contentView addSubview:viewController.view];
   [viewController didMoveToParentViewController:self];
   NSArray* constraints = @[
-    [parentView.topAnchor constraintEqualToAnchor:contentView.topAnchor],
-    [parentView.bottomAnchor constraintEqualToAnchor:contentView.bottomAnchor],
-    [parentView.leadingAnchor
+    [viewController.view.topAnchor
+        constraintEqualToAnchor:contentView.topAnchor],
+    [viewController.view.bottomAnchor
+        constraintEqualToAnchor:contentView.bottomAnchor],
+    [viewController.view.leadingAnchor
         constraintEqualToAnchor:self.regularTabsViewController.view
                                     .trailingAnchor],
-    [parentView.trailingAnchor
+    [viewController.view.trailingAnchor
         constraintEqualToAnchor:contentView.trailingAnchor],
-    [parentView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor],
     [viewController.view.widthAnchor
         constraintEqualToAnchor:self.view.widthAnchor],
-    [viewController.view.topAnchor
-        constraintEqualToAnchor:parentView.topAnchor],
-    [viewController.view.bottomAnchor
-        constraintEqualToAnchor:parentView.bottomAnchor],
-    [viewController.view.leadingAnchor
-        constraintEqualToAnchor:parentView.leadingAnchor],
-    [viewController.view.trailingAnchor
-        constraintEqualToAnchor:parentView.trailingAnchor],
   ];
   [NSLayoutConstraint activateConstraints:constraints];
 }
diff --git a/net/dns/mapped_host_resolver.cc b/net/dns/mapped_host_resolver.cc
index e9da643..bfb0890 100644
--- a/net/dns/mapped_host_resolver.cc
+++ b/net/dns/mapped_host_resolver.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/no_destructor.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "net/base/host_port_pair.h"
@@ -13,6 +14,22 @@
 
 namespace net {
 
+class MappedHostResolver::AlwaysErrorRequestImpl
+    : public HostResolver::ResolveHostRequest {
+ public:
+  explicit AlwaysErrorRequestImpl(int error) : error_(error) {}
+
+  int Start(CompletionOnceCallback callback) override { return error_; }
+
+  const base::Optional<AddressList>& GetAddressResults() const override {
+    static base::NoDestructor<base::Optional<AddressList>> nullopt_address_list;
+    return *nullopt_address_list;
+  }
+
+ private:
+  const int error_;
+};
+
 MappedHostResolver::MappedHostResolver(std::unique_ptr<HostResolver> impl)
     : impl_(std::move(impl)) {}
 
@@ -21,9 +38,13 @@
 std::unique_ptr<HostResolver::ResolveHostRequest>
 MappedHostResolver::CreateRequest(const HostPortPair& host,
                                   const NetLogWithSource& source_net_log) {
-  // TODO(crbug.com/821021): Implement.
-  NOTIMPLEMENTED();
-  return nullptr;
+  HostPortPair rewritten = host;
+  rules_.RewriteHost(&rewritten);
+
+  if (rewritten.host() == "~NOTFOUND")
+    return std::make_unique<AlwaysErrorRequestImpl>(ERR_NAME_NOT_RESOLVED);
+
+  return impl_->CreateRequest(rewritten, source_net_log);
 }
 
 int MappedHostResolver::Resolve(const RequestInfo& original_info,
diff --git a/net/dns/mapped_host_resolver.h b/net/dns/mapped_host_resolver.h
index 2626b57e3..ed603c4 100644
--- a/net/dns/mapped_host_resolver.h
+++ b/net/dns/mapped_host_resolver.h
@@ -74,6 +74,8 @@
   bool GetNoIPv6OnWifi() override;
 
  private:
+  class AlwaysErrorRequestImpl;
+
   // Modify the request |info| according to |rules_|. Returns either OK or
   // the network error code that the hostname's resolution mapped to.
   int ApplyRules(RequestInfo* info) const;
diff --git a/net/dns/mapped_host_resolver_unittest.cc b/net/dns/mapped_host_resolver_unittest.cc
index 90a2c62..eb113f0 100644
--- a/net/dns/mapped_host_resolver_unittest.cc
+++ b/net/dns/mapped_host_resolver_unittest.cc
@@ -99,6 +99,73 @@
   EXPECT_EQ("192.168.1.11:99", FirstAddress(address_list));
 }
 
+TEST(MappedHostResolverTest, Inclusion_ResolveHost) {
+  base::test::ScopedTaskEnvironment scoped_task_environment;
+
+  // Create a mock host resolver, with specific hostname to IP mappings.
+  std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+  resolver_impl->rules()->AddSimulatedFailure("*google.com");
+  resolver_impl->rules()->AddRule("baz.com", "192.168.1.5");
+  resolver_impl->rules()->AddRule("foo.com", "192.168.1.8");
+  resolver_impl->rules()->AddRule("proxy", "192.168.1.11");
+
+  // Create a remapped resolver that uses |resolver_impl|.
+  std::unique_ptr<MappedHostResolver> resolver(
+      new MappedHostResolver(std::move(resolver_impl)));
+
+  // Try resolving "www.google.com:80". There are no mappings yet, so this
+  // hits |resolver_impl| and fails.
+  TestCompletionCallback callback;
+  std::unique_ptr<HostResolver::ResolveHostRequest> request =
+      resolver->CreateRequest(HostPortPair("www.google.com", 80),
+                              NetLogWithSource());
+  int rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsError(ERR_NAME_NOT_RESOLVED));
+  EXPECT_FALSE(request->GetAddressResults());
+
+  // Remap *.google.com to baz.com.
+  EXPECT_TRUE(resolver->AddRuleFromString("map *.google.com baz.com"));
+  request.reset();
+
+  // Try resolving "www.google.com:80". Should be remapped to "baz.com:80".
+  request = resolver->CreateRequest(HostPortPair("www.google.com", 80),
+                                    NetLogWithSource());
+  rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.5:80",
+            FirstAddress(request->GetAddressResults().value()));
+  request.reset();
+
+  // Try resolving "foo.com:77". This will NOT be remapped, so result
+  // is "foo.com:77".
+  request =
+      resolver->CreateRequest(HostPortPair("foo.com", 77), NetLogWithSource());
+  rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.8:77",
+            FirstAddress(request->GetAddressResults().value()));
+  request.reset();
+
+  // Remap "*.org" to "proxy:99".
+  EXPECT_TRUE(resolver->AddRuleFromString("Map *.org proxy:99"));
+
+  // Try resolving "chromium.org:61". Should be remapped to "proxy:99".
+  request = resolver->CreateRequest(HostPortPair("chromium.org", 61),
+                                    NetLogWithSource());
+  rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.11:99",
+            FirstAddress(request->GetAddressResults().value()));
+}
+
 // Tests that exclusions are respected.
 TEST(MappedHostResolverTest, Exclusion) {
   base::test::ScopedTaskEnvironment scoped_task_environment;
@@ -146,6 +213,50 @@
   EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list));
 }
 
+// Tests that exclusions are respected.
+TEST(MappedHostResolverTest, Exclusion_ResolveHost) {
+  base::test::ScopedTaskEnvironment scoped_task_environment;
+
+  // Create a mock host resolver, with specific hostname to IP mappings.
+  std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+  resolver_impl->rules()->AddRule("baz", "192.168.1.5");
+  resolver_impl->rules()->AddRule("www.google.com", "192.168.1.3");
+
+  // Create a remapped resolver that uses |resolver_impl|.
+  std::unique_ptr<MappedHostResolver> resolver(
+      new MappedHostResolver(std::move(resolver_impl)));
+
+  TestCompletionCallback callback;
+
+  // Remap "*.com" to "baz".
+  EXPECT_TRUE(resolver->AddRuleFromString("map *.com baz"));
+
+  // Add an exclusion for "*.google.com".
+  EXPECT_TRUE(resolver->AddRuleFromString("EXCLUDE *.google.com"));
+
+  // Try resolving "www.google.com". Should not be remapped due to exclusion).
+  std::unique_ptr<HostResolver::ResolveHostRequest> request =
+      resolver->CreateRequest(HostPortPair("www.google.com", 80),
+                              NetLogWithSource());
+  int rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.3:80",
+            FirstAddress(request->GetAddressResults().value()));
+  request.reset();
+
+  // Try resolving "chrome.com:80". Should be remapped to "baz:80".
+  request = resolver->CreateRequest(HostPortPair("chrome.com", 80),
+                                    NetLogWithSource());
+  rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.5:80",
+            FirstAddress(request->GetAddressResults().value()));
+}
+
 TEST(MappedHostResolverTest, SetRulesFromString) {
   base::test::ScopedTaskEnvironment scoped_task_environment;
 
@@ -189,6 +300,46 @@
   EXPECT_EQ("192.168.1.9:60", FirstAddress(address_list));
 }
 
+TEST(MappedHostResolverTest, SetRulesFromString_ResolveHost) {
+  base::test::ScopedTaskEnvironment scoped_task_environment;
+
+  // Create a mock host resolver, with specific hostname to IP mappings.
+  std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+  resolver_impl->rules()->AddRule("baz", "192.168.1.7");
+  resolver_impl->rules()->AddRule("bar", "192.168.1.9");
+
+  // Create a remapped resolver that uses |resolver_impl|.
+  std::unique_ptr<MappedHostResolver> resolver(
+      new MappedHostResolver(std::move(resolver_impl)));
+
+  TestCompletionCallback callback;
+
+  // Remap "*.com" to "baz", and *.net to "bar:60".
+  resolver->SetRulesFromString("map *.com baz , map *.net bar:60");
+
+  // Try resolving "www.google.com". Should be remapped to "baz".
+  std::unique_ptr<HostResolver::ResolveHostRequest> request =
+      resolver->CreateRequest(HostPortPair("www.google.com", 80),
+                              NetLogWithSource());
+  int rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.7:80",
+            FirstAddress(request->GetAddressResults().value()));
+  request.reset();
+
+  // Try resolving "chrome.net:80". Should be remapped to "bar:60".
+  request = resolver->CreateRequest(HostPortPair("chrome.net", 80),
+                                    NetLogWithSource());
+  rv = request->Start(callback.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.9:60",
+            FirstAddress(request->GetAddressResults().value()));
+}
+
 // Parsing bad rules should silently discard the rule (and never crash).
 TEST(MappedHostResolverTest, ParseInvalidRules) {
   base::test::ScopedTaskEnvironment scoped_task_environment;
@@ -245,6 +396,41 @@
   EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list));
 }
 
+// Test mapping hostnames to resolving failures.
+TEST(MappedHostResolverTest, MapToError_ResolveHost) {
+  base::test::ScopedTaskEnvironment scoped_task_environment;
+
+  // Outstanding request.
+  std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+  resolver_impl->rules()->AddRule("*", "192.168.1.5");
+
+  std::unique_ptr<MappedHostResolver> resolver(
+      new MappedHostResolver(std::move(resolver_impl)));
+
+  // Remap *.google.com to resolving failures.
+  EXPECT_TRUE(resolver->AddRuleFromString("MAP *.google.com ~NOTFOUND"));
+
+  // Try resolving www.google.com --> Should give an error.
+  TestCompletionCallback callback1;
+  std::unique_ptr<HostResolver::ResolveHostRequest> request =
+      resolver->CreateRequest(HostPortPair("www.google.com", 80),
+                              NetLogWithSource());
+  int rv = request->Start(callback1.callback());
+  EXPECT_THAT(rv, IsError(ERR_NAME_NOT_RESOLVED));
+  request.reset();
+
+  // Try resolving www.foo.com --> Should succeed.
+  TestCompletionCallback callback2;
+  request = resolver->CreateRequest(HostPortPair("www.foo.com", 80),
+                                    NetLogWithSource());
+  rv = request->Start(callback2.callback());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  rv = callback2.WaitForResult();
+  EXPECT_THAT(rv, IsOk());
+  EXPECT_EQ("192.168.1.5:80",
+            FirstAddress(request->GetAddressResults().value()));
+}
+
 }  // namespace
 
 }  // namespace net
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 3bcaca6..275602f 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -130,6 +130,8 @@
       quic_migrate_sessions_early_v2(false),
       quic_max_time_on_non_default_network(
           base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
+      quic_max_migrations_to_non_default_network_on_write_error(
+          kMaxMigrationsToNonDefaultNetworkOnWriteError),
       quic_max_migrations_to_non_default_network_on_path_degrading(
           kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
       quic_allow_server_migration(false),
@@ -218,6 +220,7 @@
           params.quic_migrate_sessions_on_network_change_v2,
           params.quic_migrate_sessions_early_v2,
           params.quic_max_time_on_non_default_network,
+          params.quic_max_migrations_to_non_default_network_on_write_error,
           params.quic_max_migrations_to_non_default_network_on_path_degrading,
           params.quic_allow_server_migration,
           params.quic_race_cert_verification,
@@ -381,6 +384,9 @@
   dict->SetInteger("max_time_on_non_default_network_seconds",
                    params_.quic_max_time_on_non_default_network.InSeconds());
   dict->SetInteger(
+      "max_num_migrations_to_non_default_network_on_write_error",
+      params_.quic_max_migrations_to_non_default_network_on_write_error);
+  dict->SetInteger(
       "max_num_migrations_to_non_default_network_on_path_degrading",
       params_.quic_max_migrations_to_non_default_network_on_path_degrading);
   dict->SetBoolean("allow_server_migration",
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 3392c84..3c06036 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -182,6 +182,9 @@
     // migrates back to default network. Defaults to
     // kMaxTimeOnNonDefaultNetwork.
     base::TimeDelta quic_max_time_on_non_default_network;
+    // Maximum number of migrations to the non-default network on write error
+    // per network for each session.
+    int quic_max_migrations_to_non_default_network_on_write_error;
     // Maximum number of migrations to the non-default network on path
     // degrading per network for each session.
     int quic_max_migrations_to_non_default_network_on_path_degrading;
diff --git a/net/http/http_proxy_client_socket_wrapper_unittest.cc b/net/http/http_proxy_client_socket_wrapper_unittest.cc
index dbe908b..97f3ad1 100644
--- a/net/http/http_proxy_client_socket_wrapper_unittest.cc
+++ b/net/http/http_proxy_client_socket_wrapper_unittest.cc
@@ -137,6 +137,7 @@
         /*migrate_sessions_on_network_change_v2=*/false,
         /*migrate_sessions_early_v2=*/false,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+        kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
         allow_server_migration_, race_cert_verification_, estimate_initial_rtt_,
         client_headers_include_h2_stream_dependency_, connection_options_,
diff --git a/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc b/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
index 4e7afc9..deb3211d5 100644
--- a/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
@@ -511,6 +511,7 @@
         /*migrate_session_on_network_change_v2=*/false,
         /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+        kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
         kQuicYieldAfterPacketsRead,
         quic::QuicTime::Delta::FromMilliseconds(
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc
index f7d77a91..4d630656 100644
--- a/net/quic/chromium/quic_chromium_client_session.cc
+++ b/net/quic/chromium/quic_chromium_client_session.cc
@@ -687,6 +687,7 @@
     bool migrate_sessions_on_network_change_v2,
     NetworkChangeNotifier::NetworkHandle default_network,
     base::TimeDelta max_time_on_non_default_network,
+    int max_migrations_to_non_default_network_on_write_error,
     int max_migrations_to_non_default_network_on_path_degrading,
     int yield_after_packets,
     quic::QuicTime::Delta yield_after_duration,
@@ -709,6 +710,9 @@
       migrate_session_on_network_change_v2_(
           migrate_sessions_on_network_change_v2),
       max_time_on_non_default_network_(max_time_on_non_default_network),
+      max_migrations_to_non_default_network_on_write_error_(
+          max_migrations_to_non_default_network_on_write_error),
+      current_migrations_to_non_default_network_on_write_error_(0),
       max_migrations_to_non_default_network_on_path_degrading_(
           max_migrations_to_non_default_network_on_path_degrading),
       current_migrations_to_non_default_network_on_path_degrading_(0),
@@ -1696,6 +1700,20 @@
     return;
   }
 
+  if (GetDefaultSocket()->GetBoundNetwork() == default_network_ &&
+      current_migrations_to_non_default_network_on_write_error_ >=
+          max_migrations_to_non_default_network_on_write_error_) {
+    HistogramAndLogMigrationFailure(
+        net_log_, MIGRATION_STATUS_ON_WRITE_ERROR_DISABLED, connection_id(),
+        "Exceeds maximum number of migrations on write errpr");
+    connection()->CloseConnection(
+        quic::QUIC_PACKET_WRITE_ERROR,
+        "Too many migration for write error for the same network",
+        quic::ConnectionCloseBehavior::SILENT_CLOSE);
+    return;
+  }
+  current_migrations_to_non_default_network_on_write_error_++;
+
   const NetLogWithSource migration_net_log = NetLogWithSource::Make(
       net_log_.net_log(), NetLogSourceType::QUIC_CONNECTION_MIGRATION);
   migration_net_log.BeginEvent(
@@ -1861,12 +1879,12 @@
 
   if (connection()->IsPathDegrading()) {
     current_connection_migration_cause_ = ON_PATH_DEGRADING;
-  } else {
-    current_connection_migration_cause_ = ON_NETWORK_CONNECTED;
   }
 
   if (wait_for_new_network_) {
     wait_for_new_network_ = false;
+    if (current_connection_migration_cause_ == ON_WRITE_ERROR)
+      current_migrations_to_non_default_network_on_write_error_++;
     // |wait_for_new_network_| is true, there was no working network previously.
     // |network| is now the only possible candidate, migrate immediately.
     MigrateImmediately(network);
@@ -1891,6 +1909,7 @@
   if (disconnected_network == default_network_) {
     DVLOG(1) << "Default network: " << default_network_ << " is disconnected.";
     default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+    current_migrations_to_non_default_network_on_write_error_ = 0;
   }
 
   // Ignore the signal if the current active network is not affected.
@@ -1939,6 +1958,7 @@
            << " becomes default, old default: " << default_network_;
   default_network_ = new_network;
   current_connection_migration_cause_ = ON_NETWORK_MADE_DEFAULT;
+  current_migrations_to_non_default_network_on_write_error_ = 0;
   current_migrations_to_non_default_network_on_path_degrading_ = 0;
 
   // Simply cancel the timer to migrate back to the default network if session
diff --git a/net/quic/chromium/quic_chromium_client_session.h b/net/quic/chromium/quic_chromium_client_session.h
index c206486..4462d0f 100644
--- a/net/quic/chromium/quic_chromium_client_session.h
+++ b/net/quic/chromium/quic_chromium_client_session.h
@@ -108,6 +108,7 @@
   MIGRATION_STATUS_DISABLED_BY_CONFIG,
   MIGRATION_STATUS_PATH_DEGRADING_NOT_ENABLED,
   MIGRATION_STATUS_TIMEOUT,
+  MIGRATION_STATUS_ON_WRITE_ERROR_DISABLED,
   MIGRATION_STATUS_MAX
 };
 
@@ -383,6 +384,7 @@
       bool migrate_session_on_network_change_v2,
       NetworkChangeNotifier::NetworkHandle default_network,
       base::TimeDelta max_time_on_non_default_network,
+      int max_migrations_to_non_default_network_on_write_error,
       int max_migrations_to_non_default_network_on_path_degrading,
       int yield_after_packets,
       quic::QuicTime::Delta yield_after_duration,
@@ -727,6 +729,10 @@
   bool migrate_session_on_network_change_v2_;
   base::TimeDelta max_time_on_non_default_network_;
   // Maximum allowed number of migrations to non-default network triggered by
+  // packet write error per default network.
+  int max_migrations_to_non_default_network_on_write_error_;
+  int current_migrations_to_non_default_network_on_write_error_;
+  // Maximum allowed number of migrations to non-default network triggered by
   // path degrading per default network.
   int max_migrations_to_non_default_network_on_path_degrading_;
   int current_migrations_to_non_default_network_on_path_degrading_;
diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc
index 57134637..12f6cd5 100644
--- a/net/quic/chromium/quic_chromium_client_session_test.cc
+++ b/net/quic/chromium/quic_chromium_client_session_test.cc
@@ -154,6 +154,7 @@
         /*migrate_session_on_network_change_v2=*/false,
         /*defaulet_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+        kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
         kQuicYieldAfterPacketsRead,
         quic::QuicTime::Delta::FromMilliseconds(
diff --git a/net/quic/chromium/quic_http_stream_test.cc b/net/quic/chromium/quic_http_stream_test.cc
index fbf52ab..2f19c3c 100644
--- a/net/quic/chromium/quic_http_stream_test.cc
+++ b/net/quic/chromium/quic_http_stream_test.cc
@@ -321,6 +321,7 @@
         /*migrate_session_on_network_change_v2=*/false,
         /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+        kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
         kQuicYieldAfterPacketsRead,
         quic::QuicTime::Delta::FromMilliseconds(
diff --git a/net/quic/chromium/quic_proxy_client_socket_unittest.cc b/net/quic/chromium/quic_proxy_client_socket_unittest.cc
index 0a687a3..13faa3c 100644
--- a/net/quic/chromium/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/chromium/quic_proxy_client_socket_unittest.cc
@@ -212,6 +212,7 @@
         /*migrate_session_on_network_change_v2=*/false,
         /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+        kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
         kQuicYieldAfterPacketsRead,
         quic::QuicTime::Delta::FromMilliseconds(
diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc
index 1e6085e..45b644e 100644
--- a/net/quic/chromium/quic_stream_factory.cc
+++ b/net/quic/chromium/quic_stream_factory.cc
@@ -740,6 +740,7 @@
     bool migrate_sessions_on_network_change_v2,
     bool migrate_sessions_early_v2,
     base::TimeDelta max_time_on_non_default_network,
+    int max_migrations_to_non_default_network_on_write_error,
     int max_migrations_to_non_default_network_on_path_degrading,
     bool allow_server_migration,
     bool race_cert_verification,
@@ -794,6 +795,8 @@
                                  migrate_sessions_on_network_change_v2_),
       default_network_(NetworkChangeNotifier::kInvalidNetworkHandle),
       max_time_on_non_default_network_(max_time_on_non_default_network),
+      max_migrations_to_non_default_network_on_write_error_(
+          max_migrations_to_non_default_network_on_write_error),
       max_migrations_to_non_default_network_on_path_degrading_(
           max_migrations_to_non_default_network_on_path_degrading),
       allow_server_migration_(allow_server_migration),
@@ -1553,6 +1556,7 @@
       std::move(server_info), key.session_key(), require_confirmation,
       migrate_sessions_early_v2_, migrate_sessions_on_network_change_v2_,
       default_network_, max_time_on_non_default_network_,
+      max_migrations_to_non_default_network_on_write_error_,
       max_migrations_to_non_default_network_on_path_degrading_,
       yield_after_packets_, yield_after_duration_,
       headers_include_h2_stream_dependency_, cert_verify_flags, config,
diff --git a/net/quic/chromium/quic_stream_factory.h b/net/quic/chromium/quic_stream_factory.h
index 29db22a..680d0ac 100644
--- a/net/quic/chromium/quic_stream_factory.h
+++ b/net/quic/chromium/quic_stream_factory.h
@@ -90,8 +90,12 @@
 // migrate back to default network.
 const int64_t kMaxTimeOnNonDefaultNetworkSecs = 128;
 
+// The default maximum number of migrations to non default network on write
+// error per network.
+const int64_t kMaxMigrationsToNonDefaultNetworkOnWriteError = 5;
+
 // The default maximum number of migrations to non default network on path
-// degrading per network. Used in chromium only.
+// degrading per network.
 const int64_t kMaxMigrationsToNonDefaultNetworkOnPathDegrading = 5;
 
 enum QuicPlatformNotification {
@@ -245,6 +249,7 @@
       bool migrate_sessions_on_network_change_v2,
       bool migrate_sessions_early_v2,
       base::TimeDelta max_time_on_non_default_network,
+      int max_migrations_to_non_default_network_on_write_error,
       int max_migrations_to_non_default_network_on_path_degrading,
       bool allow_server_migration,
       bool race_cert_verification,
@@ -552,6 +557,9 @@
   // migrate back to default network.
   const base::TimeDelta max_time_on_non_default_network_;
 
+  // Maximum number of migrations to non default network on write error.
+  const int max_migrations_to_non_default_network_on_write_error_;
+
   // Maximum number of migrations to non default network on path degrading.
   const int max_migrations_to_non_default_network_on_path_degrading_;
 
diff --git a/net/quic/chromium/quic_stream_factory_fuzzer.cc b/net/quic/chromium/quic_stream_factory_fuzzer.cc
index d54157f..18b34ad 100644
--- a/net/quic/chromium/quic_stream_factory_fuzzer.cc
+++ b/net/quic/chromium/quic_stream_factory_fuzzer.cc
@@ -136,6 +136,7 @@
           quic::kMaxTimeForCryptoHandshakeSecs, quic::kInitialIdleTimeoutSecs,
           migrate_sessions_on_network_change_v2, migrate_sessions_early_v2,
           base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+          kMaxMigrationsToNonDefaultNetworkOnWriteError,
           kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
           allow_server_migration, race_cert_verification, estimate_initial_rtt,
           headers_include_h2_stream_dependency, env->connection_options,
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc
index 7cb3f67..09003ca 100644
--- a/net/quic/chromium/quic_stream_factory_test.cc
+++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -283,6 +283,7 @@
         max_idle_time_before_crypto_handshake_seconds_,
         migrate_sessions_on_network_change_v2_, migrate_sessions_early_v2_,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+        kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
         allow_server_migration_, race_cert_verification_, estimate_initial_rtt_,
         client_headers_include_h2_stream_dependency_, connection_options_,
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index fc96799..ea2c5ff 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -83,7 +83,7 @@
                          ClientSocketHandle* socket_handle,
                          HttpNetworkSession::SocketPoolType socket_pool_type,
                          const OnHostResolutionCallback& resolution_callback,
-                         const CompletionCallback& callback) {
+                         CompletionOnceCallback callback) {
   scoped_refptr<HttpProxySocketParams> http_proxy_params;
   scoped_refptr<SOCKSSocketParams> socks_params;
   std::unique_ptr<HostPortPair> proxy_host_port;
@@ -237,8 +237,8 @@
     }
 
     return socket_handle->Init(connection_group, ssl_params, request_priority,
-                               socket_tag, respect_limits, callback, ssl_pool,
-                               net_log);
+                               socket_tag, respect_limits, std::move(callback),
+                               ssl_pool, net_log);
   }
 
   // Finally, get the connection started.
@@ -254,7 +254,7 @@
 
     return socket_handle->Init(connection_group, http_proxy_params,
                                request_priority, socket_tag, respect_limits,
-                               callback, pool, net_log);
+                               std::move(callback), pool, net_log);
   }
 
   if (proxy_info.is_socks()) {
@@ -267,8 +267,8 @@
     }
 
     return socket_handle->Init(connection_group, socks_params, request_priority,
-                               socket_tag, respect_limits, callback, pool,
-                               net_log);
+                               socket_tag, respect_limits, std::move(callback),
+                               pool, net_log);
   }
 
   DCHECK(proxy_info.is_direct());
@@ -284,8 +284,8 @@
   }
 
   return socket_handle->Init(connection_group, tcp_params, request_priority,
-                             socket_tag, respect_limits, callback, pool,
-                             net_log);
+                             socket_tag, respect_limits, std::move(callback),
+                             pool, net_log);
 }
 
 }  // namespace
@@ -371,14 +371,15 @@
     const NetLogWithSource& net_log,
     ClientSocketHandle* socket_handle,
     const OnHostResolutionCallback& resolution_callback,
-    const CompletionCallback& callback) {
+    CompletionOnceCallback callback) {
   DCHECK(socket_handle);
   return InitSocketPoolHelper(
       group_type, endpoint, request_extra_headers, request_load_flags,
       request_priority, session, proxy_info, quic_version,
       ssl_config_for_origin, ssl_config_for_proxy, /*force_tunnel=*/false,
       privacy_mode, socket_tag, net_log, 0, socket_handle,
-      HttpNetworkSession::NORMAL_SOCKET_POOL, resolution_callback, callback);
+      HttpNetworkSession::NORMAL_SOCKET_POOL, resolution_callback,
+      std::move(callback));
 }
 
 int InitSocketHandleForWebSocketRequest(
@@ -395,7 +396,7 @@
     const NetLogWithSource& net_log,
     ClientSocketHandle* socket_handle,
     const OnHostResolutionCallback& resolution_callback,
-    const CompletionCallback& callback) {
+    CompletionOnceCallback callback) {
   DCHECK(socket_handle);
   return InitSocketPoolHelper(
       group_type, endpoint, request_extra_headers, request_load_flags,
@@ -403,7 +404,7 @@
       ssl_config_for_origin, ssl_config_for_proxy,
       /*force_tunnel=*/true, privacy_mode, SocketTag(), net_log, 0,
       socket_handle, HttpNetworkSession::WEBSOCKET_SOCKET_POOL,
-      resolution_callback, callback);
+      resolution_callback, std::move(callback));
 }
 
 int InitSocketHandleForRawConnect(const HostPortPair& host_port_pair,
@@ -416,7 +417,7 @@
                                   PrivacyMode privacy_mode,
                                   const NetLogWithSource& net_log,
                                   ClientSocketHandle* socket_handle,
-                                  const CompletionCallback& callback) {
+                                  CompletionOnceCallback callback) {
   DCHECK(socket_handle);
   HttpRequestHeaders request_extra_headers;
   return InitSocketPoolHelper(
@@ -425,7 +426,7 @@
       proxy_info, quic::QUIC_VERSION_UNSUPPORTED, ssl_config_for_origin,
       ssl_config_for_proxy, /*force_tunnel=*/true, privacy_mode, SocketTag(),
       net_log, 0, socket_handle, HttpNetworkSession::NORMAL_SOCKET_POOL,
-      OnHostResolutionCallback(), callback);
+      OnHostResolutionCallback(), std::move(callback));
 }
 
 int InitSocketHandleForTlsConnect(const HostPortPair& endpoint,
@@ -438,7 +439,7 @@
                                   PrivacyMode privacy_mode,
                                   const NetLogWithSource& net_log,
                                   ClientSocketHandle* socket_handle,
-                                  const CompletionCallback& callback) {
+                                  CompletionOnceCallback callback) {
   DCHECK(socket_handle);
   HttpRequestHeaders request_extra_headers;
   return InitSocketPoolHelper(
@@ -448,7 +449,7 @@
       ssl_config_for_proxy,
       /*force_tunnel=*/true, privacy_mode, SocketTag(), net_log, 0,
       socket_handle, HttpNetworkSession::NORMAL_SOCKET_POOL,
-      OnHostResolutionCallback(), callback);
+      OnHostResolutionCallback(), std::move(callback));
 }
 
 int PreconnectSocketsForHttpRequest(
diff --git a/net/socket/client_socket_pool_manager.h b/net/socket/client_socket_pool_manager.h
index 5c56de6..aeebe4d 100644
--- a/net/socket/client_socket_pool_manager.h
+++ b/net/socket/client_socket_pool_manager.h
@@ -11,7 +11,7 @@
 
 #include <string>
 
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/base/request_priority.h"
 #include "net/http/http_network_session.h"
@@ -119,7 +119,7 @@
     const NetLogWithSource& net_log,
     ClientSocketHandle* socket_handle,
     const OnHostResolutionCallback& resolution_callback,
-    const CompletionCallback& callback);
+    CompletionOnceCallback callback);
 
 // A helper method that uses the passed in proxy information to initialize a
 // ClientSocketHandle with the relevant socket pool. Use this method for
@@ -144,7 +144,7 @@
     const NetLogWithSource& net_log,
     ClientSocketHandle* socket_handle,
     const OnHostResolutionCallback& resolution_callback,
-    const CompletionCallback& callback);
+    CompletionOnceCallback callback);
 
 // Deprecated: Please do not use this outside of //net and //services/network.
 // A helper method that uses the passed in proxy information to initialize a
@@ -162,7 +162,7 @@
     PrivacyMode privacy_mode,
     const NetLogWithSource& net_log,
     ClientSocketHandle* socket_handle,
-    const CompletionCallback& callback);
+    CompletionOnceCallback callback);
 
 // Deprecated: Please do not use this outside of //net and //services/network.
 // A helper method that uses the passed in proxy information to initialize a
@@ -180,7 +180,7 @@
     PrivacyMode privacy_mode,
     const NetLogWithSource& net_log,
     ClientSocketHandle* socket_handle,
-    const CompletionCallback& callback);
+    CompletionOnceCallback callback);
 
 // Similar to InitSocketHandleForHttpRequest except that it initiates the
 // desired number of preconnect streams from the relevant socket pool.
diff --git a/ppapi/cpp/module.cc b/ppapi/cpp/module.cc
index 505991d..bb771190 100644
--- a/ppapi/cpp/module.cc
+++ b/ppapi/cpp/module.cc
@@ -207,8 +207,8 @@
   get_browser_interface_ = get_browser_interface;
 
   // Get the core interface which we require to run.
-  const PPB_Core* core = reinterpret_cast<const PPB_Core*>(GetBrowserInterface(
-      PPB_CORE_INTERFACE));
+  const PPB_Core* core = reinterpret_cast<const PPB_Core*>(
+      GetBrowserInterface(PPB_CORE_INTERFACE_1_0));
   if (!core)
     return false;
   core_ = new Core(core);
diff --git a/remoting/host/win/BUILD.gn b/remoting/host/win/BUILD.gn
index 4102b23..e74d704 100644
--- a/remoting/host/win/BUILD.gn
+++ b/remoting/host/win/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/toolchain/win/midl.gni")
+import("//build/util/lastchange.gni")
 import("//build/win/message_compiler.gni")
 import("//media/media_options.gni")
 import("//remoting/build/config/remoting_build.gni")
@@ -491,7 +492,7 @@
   variables = [
     rebase_path(chrome_version_file),
     rebase_path(remoting_version_file),
-    rebase_path("//build/util/LASTCHANGE"),
+    rebase_path(lastchange_file),
   ]
 
   output = "$root_gen_dir/remoting/{{source_name_part}}"
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb
index c75028c..c6848369fc 100644
--- a/remoting/resources/remoting_strings_am.xtb
+++ b/remoting/resources/remoting_strings_am.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ከመስመር ውጪ።</translation>
 <translation id="3695446226812920698">እንዴት እንደሆነ ይወቁ</translation>
 <translation id="3718805989288361841">በChrome የርቀት ዴስክቶፕ የመመሪያ ቅንብሮች ውስጥ አንድ ስህተት አለ። እገዛ ለማግኘት የሥርዓት አስተዳዳሪዎን ያነጋግሩ።</translation>
-<translation id="3759645055923345178">ማዋቀር ከተጠናቀቀ በኋላ ፒን ወይም የመዳረሻ ኮድ በማስገባት ከዚህ ገጽ ሆነው ኮምፒውተሩን መድረስ ይችላሉ</translation>
 <translation id="3776024066357219166">የChrome የርቀት ዴስክቶፕ ክፍለ-ጊዜው ተጠናቅቋል።</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">እባክዎ በChrome የርቀት ዴስክቶፕ መዳረሻ ለመፍቀድ መለያዎን እና ፒንዎን ከዚህ በታች ያረጋግጡ።</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">እባክዎ የኮምፒውተርዎ የኃይል አስተዳደር ቅንብሮችን ያረጋግጡና ስራ ሲፈታ እንዲተኛ አለመዋቀሩን ያረጋግጡ።</translation>
 <translation id="7810127880729796595">ስታቲስቲክስን አሳይ (ግንኙነት፦ <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">አንዳንድ የሚያስፈልጉ ክፍሎች ይጎድላሉ። እባክዎ የቅርብ ጊዜውን የChrome ስሪት መጫንዎን ያረጋግጡና እንደገና ይሞክሩ።</translation>
-<translation id="7850909060902317210">ማቀናበሩን ለማጠናቀቅ የChrome ርቀት ዴስክቶፕ ሶፍትዌሩን ይጫኑና መመሪያዎቹን ይከተሉj</translation>
 <translation id="7868137160098754906">እባክዎ የእርስዎን ፒን ለርቀት ኮምፒውተር ያስገቡ</translation>
 <translation id="7869445566579231750">ይህን መተግበሪያ ለማሄድ ፍቃድ የለዎትም።</translation>
 <translation id="7895403300744144251">በርቀት ኮምፒውተሩ ላይ ያሉ የደህንነት መመሪያዎች ከእርስዎ መለያ ጋር ግንኙነቶችን አይፈቅዱም።</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index 0ba1d24..c9d46cd 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">بلا اتصال.</translation>
 <translation id="3695446226812920698">تعرَّف على كيفية إجراء ذلك</translation>
 <translation id="3718805989288361841">‏هناك خطأ في إعدادات السياسة لسطح المكتب البعيد من Chrome. اتصل بمشرف النظام لتلقي المساعدة.</translation>
-<translation id="3759645055923345178">ستتمكن بعد اكتمال الإعداد من الوصول إلى جهاز الكمبيوتر من هذه الصفحة بإدخال رقم التعريف الشخصي أو رمز الدخول</translation>
 <translation id="3776024066357219166">‏انتهت جلسة سطح المكتب البعيد من Chrome.</translation>
 <translation id="3870154837782082782">Google Inc‎.‎</translation>
 <translation id="3884839335308961732">‏يُرجى التأكيد على حسابك ورقم تعريفك الشخصي أدناه للسماح بالدخول من خلال سطح المكتب البعيد من Chrome.</translation>
@@ -297,7 +296,6 @@
 <translation id="7782471917492991422">يرجى التحقق من إعدادات إدارة الطاقة في جهاز الكمبيوتر وضمان عدم تهيئتها على وضع السكون عند الخمول.</translation>
 <translation id="7810127880729796595">عرض الإحصاءات (جودة الاتصال: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">‏بعض المكونات المطلوبة مفقودة. يُرجى التأكد من تشغيل أحدث إصدار من Chrome وإعادة المحاولة.</translation>
-<translation id="7850909060902317210">‏ثبِّت برنامج تطبيق سطح المكتب البعيد من Chrome واتبع الإرشادات لإكمال الإعداد</translation>
 <translation id="7868137160098754906">يُرجى إدخال رقم التعريف الشخصي لجهاز الكمبيوتر البعيد.</translation>
 <translation id="7869445566579231750">ليس لديك إذن لتشغيل هذا التطبيق.</translation>
 <translation id="7895403300744144251">لا تسمح سياسات الأمان على جهاز الكمبيوتر البعيد بالاتصالات من حسابك.</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb
index 4e65b4c..91af5d0 100644
--- a/remoting/resources/remoting_strings_bg.xtb
+++ b/remoting/resources/remoting_strings_bg.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Офлайн.</translation>
 <translation id="3695446226812920698">Научете как</translation>
 <translation id="3718805989288361841">В настройките на правилата за Отдалечен работен плот на Chrome има грешка. Свържете се със системния си администратор за съдействие.</translation>
-<translation id="3759645055923345178">След като настройването завърши, ще имате достъп до компютъра от тази страница, като въведете ПИН кода или кода за достъп</translation>
 <translation id="3776024066357219166">Сесията ви в отдалечения работен плот на Chrome приключи.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Моля, потвърдете профила и ПИН кода си по-долу, за да разрешите достъпа чрез отдалечения работен плот на Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Моля, проверете настройките за управление на захранването на компютъра си и се уверете, че не е конфигуриран да преминава в спящ режим при неактивност.</translation>
 <translation id="7810127880729796595">Показване на статистическите данни (връзка: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Липсват някои задължителни компоненти. Моля, уверете се, че използвате най-новата версия на Chrome, и опитайте отново.</translation>
-<translation id="7850909060902317210">Инсталирайте софтуера Отдалечен работен плот на Chrome и изпълнете инструкциите, за да завършите настройването</translation>
 <translation id="7868137160098754906">Моля, въведете ПИН кода си за отдалечения компютър.</translation>
 <translation id="7869445566579231750">Нямате разрешение да стартирате това приложение.</translation>
 <translation id="7895403300744144251">Правилата за сигурност на отдалечения компютър не разрешават установяването на връзка от профила ви.</translation>
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb
index f6d531c8..abcc0c22 100644
--- a/remoting/resources/remoting_strings_bn.xtb
+++ b/remoting/resources/remoting_strings_bn.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">অফলাইন।</translation>
 <translation id="3695446226812920698">কীভাবে করবেন তা জানুন</translation>
 <translation id="3718805989288361841">Chrome দূরবর্তী ডেস্কটপের নীতি সেটিংসে একটি ত্রুটি হয়েছে। সহায়তার জন্য আপনার সিস্টেম প্রশাসকের সাথে যোগাযোগ করুন।</translation>
-<translation id="3759645055923345178">সেট-আপ হয়ে গেলে আপনি পিন অথবা অ্যাক্সেস কোড লিখে এই পৃষ্ঠা থেকে কম্পিউটারটি অ্যাক্সেস করতে পারবেন</translation>
 <translation id="3776024066357219166">আপনার Chrome দূরবর্তী ডেস্কটপ অধিবেশন শেষ হয়েছে৷</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome দূরবর্তী ডেস্কটপের মাধ্যমে অ্যাক্সেসের মঞ্জুরি দিতে দয়া করে নিচে আপনার অ্যাকাউন্ট এবং পিন নিশ্চিত করুন৷</translation>
@@ -297,7 +296,6 @@
 <translation id="7782471917492991422">দয়া করে আপনার কম্পিউটারের বিদ্যুত পরিচালনার সেটিং পরীক্ষা করুন এবং নিষ্ক্রিয় থাকাকালীন এটি যাতে স্লীপে কনফিগার না থাকে তা নিশ্চিত করুন৷</translation>
 <translation id="7810127880729796595">পরিসংখ্যান দেখান (সংযোগ: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">প্রয়োজনীয় কিছু উপাদান অনুপস্থিত আছে৷ আপনি Chrome-এর অতিসাম্প্রতিক সংস্করণটি ইনস্টল করেছেন কিনা দয়া করে তা নিশ্চিত করুন এবং আবার চেষ্টা করুন৷</translation>
-<translation id="7850909060902317210">Chrome দূরবর্তী ডেস্কটপ সফ্টওয়্যার ইনস্টল করুন এবং সেট-আপ সম্পূর্ণ করতে নির্দেশাবলী অনুসরণ করুন</translation>
 <translation id="7868137160098754906">দূরবর্তী কম্পিউটারের জন্য দয়া করে আপনার পিন লিখুন৷</translation>
 <translation id="7869445566579231750">এই অ্যাপ্লিকেশান চালানোর মতো অনুমতি আপনার নেই।</translation>
 <translation id="7895403300744144251">দূরবর্তী কম্পিউটারের নিরাপত্তা নীতিগুলি আপনার অ্যাকাউন্ট থেকে সংযোগ স্থাপন করার মঞ্জুরি দেয় না।</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb
index 37cefa3..2d45f10c 100644
--- a/remoting/resources/remoting_strings_ca.xtb
+++ b/remoting/resources/remoting_strings_ca.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Sense connexió</translation>
 <translation id="3695446226812920698">Més informació</translation>
 <translation id="3718805989288361841">S'ha produït un error amb la configuració de la política de l'escriptori remot de Chrome. Contacta amb l'administrador del sistema per obtenir assistència.</translation>
-<translation id="3759645055923345178">Un cop finalitzada la configuració, podràs accedir a l'ordinador des d'aquesta pàgina introduint el PIN o el codi d'accés</translation>
 <translation id="3776024066357219166">La sessió de l'escriptori remot de Chrome ha finalitzat.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Confirmeu el vostre compte i PIN a continuació per permetre l'accés per l'escriptori remot de Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Comproveu la configuració de gestió d'energia de l'ordinador i assegureu-vos que no s'hagi configurat per estar en mode de baix consum quan estigui inactiu.</translation>
 <translation id="7810127880729796595">Mostra les estadístiques (connexió: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Falten alguns components necessaris. Assegureu-vos que executeu la versió més recent de Chrome i torneu-ho a provar.</translation>
-<translation id="7850909060902317210">Instal·la el programari Escriptori remot de Chrome i segueix les instruccions per completar-ne la configuració</translation>
 <translation id="7868137160098754906">Introduïu el vostre PIN de l'ordinador remot.</translation>
 <translation id="7869445566579231750">No teniu permís per executar aquesta aplicació.</translation>
 <translation id="7895403300744144251">Les polítiques de seguretat de l'ordinador remot no permeten les connexions des del vostre compte.</translation>
diff --git a/remoting/resources/remoting_strings_cs.xtb b/remoting/resources/remoting_strings_cs.xtb
index fe0d5a3..c094131e 100644
--- a/remoting/resources/remoting_strings_cs.xtb
+++ b/remoting/resources/remoting_strings_cs.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Postup</translation>
 <translation id="3718805989288361841">Nastavení zásad Vzdálené plochy Chrome je chybné. Požádejte o pomoc administrátora systému.</translation>
-<translation id="3759645055923345178">Po dokončení nastavení k počítači budete moci přistupovat z této stránky tím, že zadáte PIN nebo přístupový kód.</translation>
 <translation id="3776024066357219166">Relace Vzdálené plochy Chrome byla ukončena.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">K povolení přístupu prostřednictvím Vzdálené plochy Chrome je třeba potvrdit účet a kód PIN níže.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Zkontrolujte prosím nastavení řízení spotřeby svého počítače a ujistěte se, zda není nastaven na přechod do režimu spánku při nečinnosti.</translation>
 <translation id="7810127880729796595">Zobrazit statistiky (připojení: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Chybí některé povinné komponenty. Zkontrolujte, zda máte nejnovější verzi Chromu, a zkuste to znovu.</translation>
-<translation id="7850909060902317210">Nainstalujte software Vzdálená plocha Chrome a podle pokynů dokončete nastavení.</translation>
 <translation id="7868137160098754906">Zadejte kód PIN pro vzdálený počítač.</translation>
 <translation id="7869445566579231750">Ke spuštění této aplikace nemáte oprávnění.</translation>
 <translation id="7895403300744144251">Zásady zabezpečení na vzdáleném počítači připojení z vašeho účtu nepovolují.</translation>
diff --git a/remoting/resources/remoting_strings_da.xtb b/remoting/resources/remoting_strings_da.xtb
index 1124914a..c4b5cee1 100644
--- a/remoting/resources/remoting_strings_da.xtb
+++ b/remoting/resources/remoting_strings_da.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Få flere oplysninger om, hvordan du gør</translation>
 <translation id="3718805989288361841">Der er en fejl i politikindstillingerne for Chrome Fjernskrivebord. Kontakt din systemadministrator for at få hjælp.</translation>
-<translation id="3759645055923345178">Når konfigurationen er fuldført, kan du få adgang til computeren via denne side ved at angive pin- eller adgangskoden</translation>
 <translation id="3776024066357219166">Din session med Chrome Fjernskrivebord er afsluttet.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Bekræft din konto og pinkode nedenfor for at tillade adgang via Chrome Fjernskrivebord.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Kontrollér indstillingerne for strømstyring på din computer, og sørg for, at den ikke er konfigureret til at gå i dvale, når den er inaktiv.</translation>
 <translation id="7810127880729796595">Vis statistik (forbindelse: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Nogle obligatoriske komponenter mangler. Kontrollér, at du har den nyeste version af Chrome, og prøv igen.</translation>
-<translation id="7850909060902317210">Installer softwaren Chrome Fjernskrivebord, og følg vejledningen for at fuldføre konfigurationen</translation>
 <translation id="7868137160098754906">Angiv din pinkode til fjerncomputeren.</translation>
 <translation id="7869445566579231750">Du har ikke tilladelse til at køre denne applikation.</translation>
 <translation id="7895403300744144251">Sikkerhedspolitikkerne på fjerncomputeren tillader ikke forbindelser fra din konto.</translation>
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb
index d63e6fc5..575a66a 100644
--- a/remoting/resources/remoting_strings_de.xtb
+++ b/remoting/resources/remoting_strings_de.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline</translation>
 <translation id="3695446226812920698">Weitere Informationen</translation>
 <translation id="3718805989288361841">Die Richtlinieneinstellungen für Chrome Remote Desktop sind fehlerhaft. Wenden Sie sich an Ihren Systemadministrator.</translation>
-<translation id="3759645055923345178">Nach der Einrichtung können Sie über diese Seite auf den Computer zugreifen, indem Sie die PIN oder den Zugriffscode eingeben</translation>
 <translation id="3776024066357219166">Ihre Chrome Remote Desktop-Sitzung wurde beendet.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Bestätigen Sie unten Ihr Konto und Ihre PIN, um Zugriff über Chrome Remote Desktop zu gewähren.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Bitte überprüfen Sie die Energieverwaltungseinstellungen Ihres Computers. Vergewissern Sie sich, dass er nicht so konfiguriert ist, dass er bei Inaktivität in den Energiesparmodus schaltet.</translation>
 <translation id="7810127880729796595">Statistiken anzeigen (Verbindung: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Es fehlen einige erforderliche Komponenten. Überprüfen Sie, ob Sie die neueste Version von Chrome verwenden, und versuchen Sie es erneut.</translation>
-<translation id="7850909060902317210">Installieren Sie die Chrome Remote Desktop-Software und schließen Sie die Einrichtung entsprechend der Anleitung ab</translation>
 <translation id="7868137160098754906">Geben Sie Ihre PIN für den Remote-Computer ein.</translation>
 <translation id="7869445566579231750">Sie sind nicht berechtigt, diese App auszuführen.</translation>
 <translation id="7895403300744144251">Die Sicherheitsrichtlinien auf dem Remote-Computer gestatten keine Verbindungen von Ihrem Konto.</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb
index 90c920cd4..048b408 100644
--- a/remoting/resources/remoting_strings_el.xtb
+++ b/remoting/resources/remoting_strings_el.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Εκτός σύνδεσης</translation>
 <translation id="3695446226812920698">Μάθετε πώς</translation>
 <translation id="3718805989288361841">Παρουσιάστηκε σφάλμα με τις ρυθμίσεις πολιτικής για την Απομακρυσμένη επιφάνεια εργασίας Chrome. Επικοινωνήστε με τον διαχειριστή του συστήματός σας για βοήθεια.</translation>
-<translation id="3759645055923345178">Μόλις ολοκληρωθεί η ρύθμιση, θα μπορείτε να έχετε πρόσβαση στον υπολογιστή από αυτήν τη σελίδα, καταχωρίζοντας το PIN ή τον κωδικό πρόσβασης</translation>
 <translation id="3776024066357219166">Η περίοδος σύνδεσης στην Απομακρυσμένη επιφάνεια εργασίας Chrome τερματίστηκε.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Επιβεβαιώστε το λογαριασμό σας και τον κωδικό σας PIN παρακάτω, για να επιτρέψετε την πρόσβαση μέσω Απομακρυσμένης επιφάνειας εργασίας Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Ελέγξτε τις ρυθμίσεις διαχείρισης ενέργειας του υπολογιστή σας και βεβαιωθείτε ότι δεν έχει διαμορφωθεί να τίθεται σε αναστολή λειτουργίας όταν είναι αδρανής.</translation>
 <translation id="7810127880729796595">Εμφάνιση στατιστικών στοιχείων (σύνδεση: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Λείπουν ορισμένα απαιτούμενα στοιχεία. Βεβαιωθείτε ότι εκτελείτε την πιο πρόσφατη έκδοση του Chrome και δοκιμάστε ξανά.</translation>
-<translation id="7850909060902317210">Εγκαταστήστε το λογισμικό Απομακρυσμένη επιφάνεια εργασίας Chrome και ακολουθήστε τις οδηγίες, για να ολοκληρώστε τη ρύθμιση</translation>
 <translation id="7868137160098754906">Καταχωρίστε το PIN σας για τον απομακρυσμένο υπολογιστή.</translation>
 <translation id="7869445566579231750">Δεν έχετε δικαίωμα εκτέλεσης αυτής της εφαρμογής.</translation>
 <translation id="7895403300744144251">Οι πολιτικές ασφάλειας στον απομακρυσμένο υπολογιστή δεν επιτρέπουν τις συνδέσεις από τον λογαριασμό σας.</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb
index 64fb6f9b..cd75f9d 100644
--- a/remoting/resources/remoting_strings_en-GB.xtb
+++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Find out how</translation>
 <translation id="3718805989288361841">There is an error with the policy settings for Chrome Remote Desktop. Contact your system administrator for assistance.</translation>
-<translation id="3759645055923345178">After setup is complete, you'll be able to access the computer from this page by entering the PIN or access code</translation>
 <translation id="3776024066357219166">Your Chrome Remote Desktop session has ended.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Please confirm your account and PIN below to allow access by Chrome Remote Desktop.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Please check your computer's power management settings and ensure that it is not configured to sleep when idle.</translation>
 <translation id="7810127880729796595">Show statistics (connection: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Some required components are missing. Please make sure that you're running the latest version of Chrome and try again.</translation>
-<translation id="7850909060902317210">Install Chrome Remote Desktop software and follow the instructions to complete setup</translation>
 <translation id="7868137160098754906">Please enter your PIN for the remote computer.</translation>
 <translation id="7869445566579231750">You do not have permission to run this application.</translation>
 <translation id="7895403300744144251">Security policies on the remote computer do not allow connections from your account.</translation>
diff --git a/remoting/resources/remoting_strings_es-419.xtb b/remoting/resources/remoting_strings_es-419.xtb
index 9339f48..a7465b59 100644
--- a/remoting/resources/remoting_strings_es-419.xtb
+++ b/remoting/resources/remoting_strings_es-419.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Sin conexión</translation>
 <translation id="3695446226812920698">Más información</translation>
 <translation id="3718805989288361841">Se produjo un error con la configuración de la política para Escritorio remoto de Chrome. Comunícate con el administrador del sistema para obtener ayuda.</translation>
-<translation id="3759645055923345178">Después de completar la configuración, podrás acceder a la computadora desde esta página al ingresar el PIN o el código de acceso</translation>
 <translation id="3776024066357219166">Se cerró tu sesión en Escritorio remoto de Chrome.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Confirma la cuenta y el PIN a continuación para permitir el acceso del Escritorio remoto de Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Configura la administración de energía de tu computadora y asegúrate de que no se habilite el modo de hibernación cuando esté inactiva.</translation>
 <translation id="7810127880729796595">Mostrar estadísticas (conexión: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Faltan algunos de los componentes necesarios. Asegúrate de estar usando la última versión de Chrome y vuelve a intentarlo.</translation>
-<translation id="7850909060902317210">Instala el software de Escritorio remoto de Chrome y sigue las instrucciones para finalizar la configuración</translation>
 <translation id="7868137160098754906">Ingresa tu PIN para la computadora remota.</translation>
 <translation id="7869445566579231750">No tienes permiso para ejecutar esta aplicación.</translation>
 <translation id="7895403300744144251">Las políticas de seguridad en la computadora remota no admiten conexiones de tu cuenta.</translation>
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb
index 3ff00164..6b263d7 100644
--- a/remoting/resources/remoting_strings_es.xtb
+++ b/remoting/resources/remoting_strings_es.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">No conectado</translation>
 <translation id="3695446226812920698">Descubre cómo hacerlo</translation>
 <translation id="3718805989288361841">Se ha producido un error relacionado con la configuración de políticas de Escritorio Remoto de Chrome. Ponte en contacto con el administrador de tu sistema para obtener ayuda.</translation>
-<translation id="3759645055923345178">Cuando hayas completado la configuración, podrás acceder al ordenador desde esta página introduciendo el PIN o el código de acceso</translation>
 <translation id="3776024066357219166">Ha finalizado tu sesión en Escritorio Remoto de Chrome.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Confirma la cuenta y el PIN a continuación para permitir el acceso de Escritorio Remoto de Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Comprueba las opciones de energía de tu ordenador y asegúrate de que no esté configurado para entrar en modo de suspensión cuando esté inactivo.</translation>
 <translation id="7810127880729796595">Mostrar estadísticas (conexión: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Faltan algunos componentes requeridos. Asegúrate de estar ejecutando la última versión de Chrome y vuelve a intentarlo.</translation>
-<translation id="7850909060902317210">Instala el software Escritorio Remoto de Chrome y sigue las instrucciones para completar la configuración</translation>
 <translation id="7868137160098754906">Introduce tu código PIN para el ordenador remoto.</translation>
 <translation id="7869445566579231750">No tienes permiso para ejecutar esta aplicación.</translation>
 <translation id="7895403300744144251">Las políticas de seguridad del ordenador remoto no permiten conexiones desde tu cuenta.</translation>
diff --git a/remoting/resources/remoting_strings_et.xtb b/remoting/resources/remoting_strings_et.xtb
index 4fa4c76c..3aaf7f5a 100644
--- a/remoting/resources/remoting_strings_et.xtb
+++ b/remoting/resources/remoting_strings_et.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Võrguühenduseta.</translation>
 <translation id="3695446226812920698">Lisateave</translation>
 <translation id="3718805989288361841">Chrome Remote Desktopi reegli seadetes on viga. Abi saamiseks võtke ühendust süsteemiadministraatoriga.</translation>
-<translation id="3759645055923345178">Kui seadistus on lõpule viidud, pääsete arvutile juurde sellelt lehelt, kui sisestate PIN- või pääsukoodi</translation>
 <translation id="3776024066357219166">Teie Chrome Remote Desktopi seanss on lõppenud.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome Remote Desktopi abil juurdepääsu lubamiseks kinnitage allpool oma konto ja PIN-kood.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Kontrollige oma arvuti toitehalduse seadeid ja veenduge, et arvuti ei ole seadistatud lülituma jõudeolekul unerežiimile.</translation>
 <translation id="7810127880729796595">Kuva statistika (ühendus: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Mõned vajalikud komponendid on puudu. Veenduge, et käitaksite Chrome'i uusimat versiooni, ja proovige uuesti.</translation>
-<translation id="7850909060902317210">Installige Chrome Remote Desktopi tarkvara ja järgige seadistuse lõpuleviimiseks juhiseid</translation>
 <translation id="7868137160098754906">Sisestage kaugarvuti PIN-kood.</translation>
 <translation id="7869445566579231750">Teil puudub luba selle rakenduse käitamiseks.</translation>
 <translation id="7895403300744144251">Kaugarvuti turvareeglid ei luba teie kontolt pärinevaid ühendusi.</translation>
diff --git a/remoting/resources/remoting_strings_fa.xtb b/remoting/resources/remoting_strings_fa.xtb
index 0d67400c..289772e 100644
--- a/remoting/resources/remoting_strings_fa.xtb
+++ b/remoting/resources/remoting_strings_fa.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">آفلاین.</translation>
 <translation id="3695446226812920698">با نحوه انجام کار آشنا شوید</translation>
 <translation id="3718805989288361841">‏خطایی در تنظیمات خط‌مشی «کنترل رایانه ازراه‌دور Chrome» وجود دارد. برای راهنمایی با سرپرست سیستم خود تماس بگیرید.</translation>
-<translation id="3759645055923345178">بعد از تکمیل راه‌اندازی، می‌توانید با وارد کردن پین یا کد دسترسی، از این صفحه به رایانه دسترسی پیدا کنید</translation>
 <translation id="3776024066357219166">‏جلسه "کنترل رایانه ازراه‌دور Chrome" تمام شد.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">‏برای اجازه دسترسی ازطریق برنامه کنترل رایانه ازراه‌دور Chrome، لطفاً حساب و پین خود را در زیر تأیید کنید.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">لطفاً تنظیمات مدیریت نیروی رایانهٔ خود را بررسی کنید و مطمئن شوید که بر روی خواب در هنگام عدم استفاده پیکربندی نشده باشد.</translation>
 <translation id="7810127880729796595">نمایش آمار (ارتباط: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">‏برخی از بخش‌ها از بین رفته‌اند. لطفاً مطمئن شوید آخرین نسخه Chrome را دارید و دوباره امتحان کنید.</translation>
-<translation id="7850909060902317210">‏نرم‌افزار «کنترل رایانه ازراه‌دور Chrome» را نصب کنید و دستورالعمل‌ها را برای تکمیل راه‌اندازی دنبال کنید</translation>
 <translation id="7868137160098754906">لطفاً پین خودتان را برای رایانه راه دور وارد کنید.</translation>
 <translation id="7869445566579231750">مجوز اجرای این برنامه را ندارید.</translation>
 <translation id="7895403300744144251">خط‌مشی‌های امنیتی در رایانه راه دور به اتصالات از حساب شما اجازه نمی‌دهد.</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb
index 57fb470..2b58f4c8 100644
--- a/remoting/resources/remoting_strings_fi.xtb
+++ b/remoting/resources/remoting_strings_fi.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Lisätietoja</translation>
 <translation id="3718805989288361841">Chrome-etäkäytön käytäntöasetuksissa on virhe. Ota yhteyttä järjestelmänvalvojaan.</translation>
-<translation id="3759645055923345178">Kun määritys on valmis, voit käyttää tietokonetta tältä sivulta antamalla PIN- tai käyttökoodin.</translation>
 <translation id="3776024066357219166">Chrome-etäkäyttökerta on päättynyt.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Myönnä käyttöoikeus Chrome-etäkäytön kautta vahvistamalla tilisi ja PIN-koodisi alla.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Tarkista tietokoneen virranhallinta-asetukset ja varmista, että sitä ei ole määritetty siirtymään virransäästötilaan, kun sitä ei käytetä.</translation>
 <translation id="7810127880729796595">Näytä tilastot (yhteys: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Jotkin vaadittavat komponentit puuttuvat. Varmista, että käytät uusinta Chrome-versiota, ja yritä uudelleen.</translation>
-<translation id="7850909060902317210">Asenna Chrome-etäkäyttöohjelma ja viimeistele määritys näytöllä näkyvien ohjeiden mukaisesti.</translation>
 <translation id="7868137160098754906">Anna etätietokoneen PIN-koodi.</translation>
 <translation id="7869445566579231750">Sinulla ei ole lupaa suorittaa tätä sovellusta.</translation>
 <translation id="7895403300744144251">Etätietokoneen suojauskäytännöt eivät salli tililtäsi saapuvia yhteyksiä.</translation>
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb
index 694a4bcd7..2149aff 100644
--- a/remoting/resources/remoting_strings_fil.xtb
+++ b/remoting/resources/remoting_strings_fil.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Naka-offline.</translation>
 <translation id="3695446226812920698">Alamin kung paano</translation>
 <translation id="3718805989288361841">Mayroong error sa mga setting ng patakaran para sa Remote na Desktop ng Chrome. Makipag-ugnayan sa iyong system administrator para sa tulong.</translation>
-<translation id="3759645055923345178">Pagkatapos ng pag-set up, maa-access mo ang computer mula sa page na ito sa pamamagitan ng paglalagay ng PIN o access code</translation>
 <translation id="3776024066357219166">Natapos na ang iyong session sa Remote na Desktop ng Chrome.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Pakikumpirma ang iyong account at PIN sa ibaba upang payagan ang pag-access ng Remote na Desktop ng Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Pakisuri ang mga setting sa pamamahala ng power ng iyong computer at tiyakin na hindi ito naka-configure na mag-sleep kapag idle.</translation>
 <translation id="7810127880729796595">Ipakita ang mga istatistika (koneksyon: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Nawawala ang ilang bahagi na kinakailangan. Pakitiyak na ginagamit mo ang pinakabagong bersyon ng Chrome at subukang muli.</translation>
-<translation id="7850909060902317210">I-install ang software na Remote na Desktop ng Chrome at sundin ang mga tagubilin upang makumpleto ang pag-set up</translation>
 <translation id="7868137160098754906">Pakilagay ang iyong PIN para sa remote na computer.</translation>
 <translation id="7869445566579231750">Wala kang pahintulot na gamitin ang application na ito.</translation>
 <translation id="7895403300744144251">Hindi pinapayagan ng mga patakaran sa seguridad sa remote na computer ang mga koneksyon mula sa iyong account.</translation>
diff --git a/remoting/resources/remoting_strings_fr.xtb b/remoting/resources/remoting_strings_fr.xtb
index c449253..646457f 100644
--- a/remoting/resources/remoting_strings_fr.xtb
+++ b/remoting/resources/remoting_strings_fr.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Hors connexion</translation>
 <translation id="3695446226812920698">Comment procéder</translation>
 <translation id="3718805989288361841">Erreur dans les paramètres des règles pour le bureau à distance Chrome. Veuillez contacter votre administrateur système pour obtenir de l'aide.</translation>
-<translation id="3759645055923345178">Une fois la configuration terminée, vous pouvez accéder à l'ordinateur depuis cette page après avoir saisi votre code d'identification ou le code d'accès requis</translation>
 <translation id="3776024066357219166">La session du bureau à distance Google Chrome est terminée.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Veuillez confirmer le compte et le code d'accès ci-dessous pour autoriser l'accès du Bureau à distance Google Chrome à votre compte.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Veuillez vérifier les paramètres de gestion d'alimentation de votre ordinateur et vous assurer qu'il n'est pas configuré pour se mettre en veille en cas d'inactivité.</translation>
 <translation id="7810127880729796595">Afficher les statistiques (connexion : <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Certains composants nécessaires  sont introuvables. Veuillez vous assurer que vous utilisez la dernière version de Chrome, puis réessayer.</translation>
-<translation id="7850909060902317210">Installez le logiciel Bureau à distance Chrome, puis suivez les instructions pour terminer la configuration</translation>
 <translation id="7868137160098754906">Veuillez saisir le code d'accès de l'ordinateur distant.</translation>
 <translation id="7869445566579231750">Vous n'êtes pas autorisé à exécuter cette application.</translation>
 <translation id="7895403300744144251">Les règles de sécurité de l'ordinateur distant n'autorisent pas les connexions à partir de votre compte.</translation>
diff --git a/remoting/resources/remoting_strings_gu.xtb b/remoting/resources/remoting_strings_gu.xtb
index fa97d0d..f1abef9 100644
--- a/remoting/resources/remoting_strings_gu.xtb
+++ b/remoting/resources/remoting_strings_gu.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ઑફલાઇન.</translation>
 <translation id="3695446226812920698">જાણો કેવી રીતે</translation>
 <translation id="3718805989288361841">Chrome રિમોટ ડેસ્કટૉપ માટેની નીતિ સેટિંગ્સમાં એક ભૂલ આવી છે. સહાય માટે તમારા સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરો.</translation>
-<translation id="3759645055923345178">સેટઅપ પૂર્ણ થાય, તે પછી તમે પિન અથવા ઍક્સેસ કોડ દાખલ કરીને આ પેજ પરથી કમ્પ્યુટરને ઍક્સેસ કરી શકશો</translation>
 <translation id="3776024066357219166">તમારું Chrome રીમોટ ડેસ્કટૉપ સત્ર સમાપ્ત થયું.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome રીમોટ ડેસ્કટૉપ દ્વારા ઍક્સેસની મંજૂરી આપવા માટે કૃપા કરીને નીચે તમારા એકાઉન્ટ અને પિનની પુષ્ટિ કરો.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">કૃપા કરી તમારા કમ્પ્યુટરની પાવર સંચાલન સેટિંગ્સ જુઓ અને સુનિશ્ચિત કરો કે તેને નિષ્ક્રિય હોવા પર સ્લીપ માટે ગોઠવેલી નથી.</translation>
 <translation id="7810127880729796595">આંકડા દર્શાવો (કનેક્શન: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">કેટલાક આવશ્યક ઘટકો ખૂટે છે. કૃપા કરીને ખાતરી કરો કે તમે Chrome નું નવીનતમ સંસ્કરણ ચલાવી રહ્યાં છો અને ફરીથી પ્રયાસ કરો.</translation>
-<translation id="7850909060902317210">Chrome રિમોટ ડેસ્કટૉપ સૉફ્ટવેર ઇન્સ્ટૉલ કરો અને સેટઅપ પૂર્ણ કરવા માટે સૂચનાઓને અનુસરો</translation>
 <translation id="7868137160098754906">રિમોટ કમ્પ્યુટર માટે કૃપા કરીને તમારો PIN દાખલ કરો.</translation>
 <translation id="7869445566579231750">તમને આ એપ્લિકેશનને શરૂ કરવાની પરવાનગી નથી.</translation>
 <translation id="7895403300744144251">રિમોટ કમ્પ્યુટર પરની સુરક્ષા નીતિઓ તમારા એકાઉન્ટથી કનેક્શન્સની મંજૂરી આપતી નથી.</translation>
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb
index 8c2f0990..61f63ba 100644
--- a/remoting/resources/remoting_strings_hi.xtb
+++ b/remoting/resources/remoting_strings_hi.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ऑफ़लाइन.</translation>
 <translation id="3695446226812920698">तरीका जानें</translation>
 <translation id="3718805989288361841">Chrome दूरस्थ डेस्कटॉप की नीति सेटिंग में कोई गड़बड़ी है. सहायता के लिए अपने सिस्टम व्यवस्थापक से संपर्क करें.</translation>
-<translation id="3759645055923345178">सेटअप पूरा होने के बाद, आप पिन या एक्‍सेस कोड डालकर इस पेज से कंप्‍यूटर एक्‍सेस कर सकेंगे</translation>
 <translation id="3776024066357219166">आपका Chrome दूरस्थ डेस्कटॉप सत्र समाप्त हो चुका है.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome दूरस्थ डेस्कटॉप द्वारा एक्सेस की अनुमति देने के लिए कृपया नीचे अपने खाते और PIN की दुबारा पूछें.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">कृपया अपने कंप्‍यूटर की शक्ति प्रबंधन सेटिंग जाँचें और सुनिश्चित करें कि उसे प्रयोग में नहीं रहते समय सुप्त रहने के लिए कॉन्‍फ़िगर नहीं किया गया है.</translation>
 <translation id="7810127880729796595">आंकड़े दिखाएं (कनेक्‍शन: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">कुछ आवश्‍यक घटक अनुपलब्‍ध है. कृपया सुनिश्‍चित करें कि आप Chrome का नवीनतम वर्शन चला रहे हैं और पुन: प्रयास करें.</translation>
-<translation id="7850909060902317210">Chrome दूरस्थ डेस्कटॉप सॉफ़्टवेयर इंस्‍टॉल करें और सेटअप पूरा करने के लिए निर्देशों का पालन करें</translation>
 <translation id="7868137160098754906">कृपया दूरस्थ कंप्यूटर के लिए अपना पिन डालें.</translation>
 <translation id="7869445566579231750">आपको इस ऐप्‍लिकेशन को चलाने की अनुमति नहीं है.</translation>
 <translation id="7895403300744144251">दूरस्थ कंप्यूटर की सुरक्षा नीतियां आपके खाते से कनेक्शन की अनुमति नहीं देती हैं.</translation>
diff --git a/remoting/resources/remoting_strings_hr.xtb b/remoting/resources/remoting_strings_hr.xtb
index 06dea58..f52c4704 100644
--- a/remoting/resources/remoting_strings_hr.xtb
+++ b/remoting/resources/remoting_strings_hr.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Saznajte kako</translation>
 <translation id="3718805989288361841">Došlo je do pogreške s postavkama pravila za Udaljenu radnu površinu Chrome. Obratite se administratoru sustava za pomoć.</translation>
-<translation id="3759645055923345178">Nakon dovršetka postavljanja moći ćete pristupiti računalu s te stranice unosom PIN-a ili pristupnog koda</translation>
 <translation id="3776024066357219166">Završila je vaša sesija u aplikaciji Udaljena radna površina Chrome.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Potvrdite svoj račun i PIN u nastavku da biste usluzi Udaljena radna površina Chrome dozvolili pristup.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Provjerite postavke upravljanja potrošnjom energije svojeg računala i provjerite da nije konfigurirano tako da prelazi u stanje mirovanja kad je neaktivno.</translation>
 <translation id="7810127880729796595">Prikaži statistiku (veza: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Nedostaju neke obavezne komponente. Provjerite jeste li pokrenuli najnoviju verziju Chromea i pokušajte ponovo.</translation>
-<translation id="7850909060902317210">Instalirajte softver Udaljene radne površine Chrome i slijedite upute da biste dovršili postavljanje</translation>
 <translation id="7868137160098754906">Unesite PIN za udaljeno računalo.</translation>
 <translation id="7869445566579231750">Nemate dopuštenje za pokretanje te aplikacije.</translation>
 <translation id="7895403300744144251">Sigurnosna pravila na udaljenom računalu ne dopuštaju povezivanje s vašeg računa.</translation>
diff --git a/remoting/resources/remoting_strings_hu.xtb b/remoting/resources/remoting_strings_hu.xtb
index 6b2fb31..e2786978 100644
--- a/remoting/resources/remoting_strings_hu.xtb
+++ b/remoting/resources/remoting_strings_hu.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Tudnivalók</translation>
 <translation id="3718805989288361841">Hibát észleltünk a Chrome távoliasztal-szolgáltatás házirend-beállításaival kapcsolatban. Segítségért forduljon a rendszergazdához.</translation>
-<translation id="3759645055923345178">Ha végzett a beállítással, a PIN-, illetve a hozzáférési kód megadásával hozzáférhet a számítógéphez erről az oldalról.</translation>
 <translation id="3776024066357219166">A Chrome távoliasztal-szolgáltatás munkamenet véget ért.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Kérjük, erősítse meg a fiókot és a PIN kódot alább a Chrome távoliasztal-szolgáltatás hozzáférésének engedélyezéséhez.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Kérjük, ellenőrizze a számítógép energiagazdálkodási beállításait, és győződjön meg róla, hogy az tétlenség esetén nincs alvó üzemmódra állítva.</translation>
 <translation id="7810127880729796595">Statisztika megjelenítése (kapcsolat: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Hiányzik néhány szükséges összetevő. Kérjük, ellenőrizze, hogy a Chrome legfrissebb verzióját használja-e, majd próbálja újra.</translation>
-<translation id="7850909060902317210">Telepítse a Chrome távoliasztal-szolgáltatás szoftvert, és kövesse az utasításokat a beállításhoz</translation>
 <translation id="7868137160098754906">Kérjük, adja meg a PIN kódot a távoli számítógéphez.</translation>
 <translation id="7869445566579231750">Nincs engedélye az alkalmazás futtatására.</translation>
 <translation id="7895403300744144251">A távoli számítógép biztonsági házirendjei nem engedélyeznek kapcsolatokat a fiókja felől.</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb
index 3212fc6..693e52c 100644
--- a/remoting/resources/remoting_strings_id.xtb
+++ b/remoting/resources/remoting_strings_id.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Pelajari caranya</translation>
 <translation id="3718805989288361841">Terjadi error pada setelan kebijakan untuk Chrome Desktop Jarak Jauh. Hubungi administrator sistem untuk mendapatkan bantuan.</translation>
-<translation id="3759645055923345178">Setelah penyiapan selesai, Anda dapat mengakses komputer dari halaman ini dengan memasukkan PIN atau kode akses</translation>
 <translation id="3776024066357219166">Sesi Chrome Desktop Jarak Jauh Anda telah berakhir.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Konfirmasi akun dan PIN Anda di bawah guna mengizinkan akses oleh Chrome Desktop Jarak Jauh</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Periksa setelan pengelolaan daya komputer Anda dan pastikan agar tidak dikonfigurasi untuk tidur ketika menganggur.</translation>
 <translation id="7810127880729796595">Tampilkan statistik (sambungan: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Beberapa komponen yang diperlukan tidak ada. Pastikan Anda menjalankan Chrome versi terbaru dan coba lagi.</translation>
-<translation id="7850909060902317210">Instal software Chrome Desktop Jarak Jauh dan ikuti petunjuk untuk menyelesaikan penyiapan</translation>
 <translation id="7868137160098754906">Masukkan PIN komputer jarak jauh Anda.</translation>
 <translation id="7869445566579231750">Anda tidak memiliki izin untuk menjalankan aplikasi ini.</translation>
 <translation id="7895403300744144251">Kebijakan keamanan di komputer jarak jauh tidak mengizinkan sambungan dari akun Anda.</translation>
diff --git a/remoting/resources/remoting_strings_it.xtb b/remoting/resources/remoting_strings_it.xtb
index 5571642..ebf88b8 100644
--- a/remoting/resources/remoting_strings_it.xtb
+++ b/remoting/resources/remoting_strings_it.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Scopri come</translation>
 <translation id="3718805989288361841">Si è verificato un errore con le impostazioni delle norme per Chrome Remote Desktop. Contatta l'amministratore di sistema per ricevere assistenza.</translation>
-<translation id="3759645055923345178">Una volta completata la configurazione, potrai accedere al computer da questa pagina inserendo il PIN o il codice di accesso</translation>
 <translation id="3776024066357219166">La sessione Chrome Remote Desktop è terminata.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Conferma il tuo account e il PIN per consentire l'accesso tramite Chrome Remote Desktop.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Verifica le impostazioni di risparmio energia del computer e verifica che non sia configurata la sospensione per inattività.</translation>
 <translation id="7810127880729796595">Mostra statistiche (connessione: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Mancano alcuni componenti obbligatori. Assicurati di avere l'ultima versione di Chrome e riprova.</translation>
-<translation id="7850909060902317210">Installa il software Chrome Remote Desktop e segui le istruzioni per completare la configurazione</translation>
 <translation id="7868137160098754906">Inserisci il codice PIN per il computer remoto.</translation>
 <translation id="7869445566579231750">Non sei autorizzato a eseguire questa applicazione.</translation>
 <translation id="7895403300744144251">Le norme di sicurezza del computer remoto non consentono connessioni dal tuo account.</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb
index 534cac2..9c09531e 100644
--- a/remoting/resources/remoting_strings_iw.xtb
+++ b/remoting/resources/remoting_strings_iw.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">פועל במצב לא מקוון.</translation>
 <translation id="3695446226812920698">איך עושים זאת</translation>
 <translation id="3718805989288361841">‏אירעה שגיאה בהגדרות המדיניות לשולחן העבודה המרוחק של Chrome. פנה למנהל המערכת כדי לקבל עזרה.</translation>
-<translation id="3759645055923345178">‏כשתהליך ההגדרה יסתיים, אפשר יהיה לגשת למחשב מדף זה על ידי הזנת ה-PIN או קוד הגישה</translation>
 <translation id="3776024066357219166">‏הפעילות של 'שולחן עבודה מרוחק של Chrome' הסתיימה.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">‏אשר את החשבון ומספר ה-PIN שלך שמפורטים למטה כדי לאפשר גישה באמצעות שולחן העבודה המרוחק של Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">בדוק את הגדרות ניהול צריכת החשמל של המחשב כדי לוודא שאינו מוגדר לעבור למצב שינה בזמן חוסר פעילות.</translation>
 <translation id="7810127880729796595">הצג סטטיסטיקה (חיבור: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">‏חלק מהרכיבים הדרושים חסרים. ודא שאתה משתמש בגרסה העדכנית ביותר של Chrome ונסה שוב.</translation>
-<translation id="7850909060902317210">‏יש להתקין את התוכנה 'שולחן עבודה מרוחק של Chrome' ולבצע את ההוראות להשלמת ההגדרה</translation>
 <translation id="7868137160098754906">‏הזן את מספר ה-PIN עבור המחשב המרוחק.</translation>
 <translation id="7869445566579231750">אין לך הרשאה להריץ את היישום הזה.</translation>
 <translation id="7895403300744144251">מדיניות האבטחה במחשב המרוחק אינה מתירה חיבורים מהחשבון שלך.</translation>
diff --git a/remoting/resources/remoting_strings_ja.xtb b/remoting/resources/remoting_strings_ja.xtb
index cc82f2c..c200ceb6 100644
--- a/remoting/resources/remoting_strings_ja.xtb
+++ b/remoting/resources/remoting_strings_ja.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">オフラインです。</translation>
 <translation id="3695446226812920698">詳細</translation>
 <translation id="3718805989288361841">Chrome リモート デスクトップのポリシー設定にエラーがあります。不明点はシステム管理者にお問い合わせください。</translation>
-<translation id="3759645055923345178">設定が完了したら、このページで PIN またはアクセスコードを入力してパソコンにアクセスできます</translation>
 <translation id="3776024066357219166">Chrome リモート デスクトップ セッションが終了しました。</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome リモート デスクトップによるアクセスを許可するには、下記でアカウントと PIN の確認を行ってください。</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">お使いのパソコンの電源管理設定で、アイドル状態のときにスリープにならないように設定されていることをご確認ください。</translation>
 <translation id="7810127880729796595">統計情報を表示(接続状態: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">必要なコンポーネントが見つかりません。実行している Chrome のバージョンが最新であることを確認し、もう一度お試しください。</translation>
-<translation id="7850909060902317210">Chrome リモート デスクトップ ソフトウェアをインストールし、案内に従って設定を完了します</translation>
 <translation id="7868137160098754906">リモート パソコンの PIN を入力してください。</translation>
 <translation id="7869445566579231750">このアプリケーションを実行する権限がありません。</translation>
 <translation id="7895403300744144251">リモート パソコンのセキュリティ ポリシーで、ご使用のアカウントからの接続が許可されていません。</translation>
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb
index 7876b46..19ac2c4c 100644
--- a/remoting/resources/remoting_strings_kn.xtb
+++ b/remoting/resources/remoting_strings_kn.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ಆಫ್‌ಲೈನ್.</translation>
 <translation id="3695446226812920698">ಹೇಗೆ ಎಂಬುದನ್ನು ತಿಳಿದುಕೊಳ್ಳಿ</translation>
 <translation id="3718805989288361841">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್‌ಗೆ ನೀತಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೂಲಕ ದೋಷ ಕಂಡುಬಂದಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
-<translation id="3759645055923345178">ಹೊಂದಿಸುವಿಕೆ ಪೂರ್ತಿಯಾದ ಬಳಿಕ, ಪಿನ್ ಅಥವಾ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ, ನೀವು ಈ ಪುಟದಿಂದ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಪ್ರವೇಶ ಪಡೆಯಬಹುದು</translation>
 <translation id="3776024066357219166">ನಿಮ್ಮ Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್ ಅವಧಿಯು ಕೊನೆಗೊಂಡಿದೆ.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್ ಮೂಲಕ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲು, ಕೆಳಗೆ ನಿಮ್ಮ ಖಾತೆ ಮತ್ತು PIN ಅನ್ನು ದೃಢೀಕರಿಸಿ.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">ದಯವಿಟ್ಟು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ವಿದ್ಯುತ್ ನಿರ್ವಹಣಾ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ತಟಸ್ಥವಾಗಿರುವಾಗ ಅದನ್ನು ನಿದ್ರೆಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="7810127880729796595">ಅಂಕಿಅಂಶಗಳನ್ನು ತೋರಿಸಿ (ಸಂಪರ್ಕ: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">ಅಗತ್ಯವಿರುವ ಕೆಲವು ಅಂಶಗಳು ಕಾಣೆಯಾಗಿವೆ. ನೀವು Chrome ನ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯನ್ನು ರನ್ ಮಾಡುತ್ತಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="7850909060902317210">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್ ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ಸ್ಥಾಪಿಸಿ ಮತ್ತು ಹೊಂದಿಸುವಿಕೆಯನ್ನು ಪೂರ್ತಿಗೊಳಿಸಲು ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ</translation>
 <translation id="7868137160098754906">ದಯವಿಟ್ಟು ರಿಮೋಟ್ ಕಂಪ್ಯೂಟರ್‌ಗಾಗಿ ನಿಮ್ಮ PIN ನಮೂದಿಸಿ.</translation>
 <translation id="7869445566579231750">ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ರನ್ ಮಾಡಲು ಅನುಮತಿಯನ್ನು ಹೊಂದಿಲ್ಲ.</translation>
 <translation id="7895403300744144251">ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಸಂಪರ್ಕಗಳನ್ನು ರಿಮೋಟ್ ಕಂಪ್ಯೂಟರ್‌ಗಳಲ್ಲಿನ ಭದ್ರತಾ ನೀತಿಗಳು ಅನುಮತಿಸುವುದಿಲ್ಲ.</translation>
diff --git a/remoting/resources/remoting_strings_ko.xtb b/remoting/resources/remoting_strings_ko.xtb
index 448e88b30..cff34a478 100644
--- a/remoting/resources/remoting_strings_ko.xtb
+++ b/remoting/resources/remoting_strings_ko.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">오프라인.</translation>
 <translation id="3695446226812920698">자세히 알아보기</translation>
 <translation id="3718805989288361841">Chrome 원격 데스크톱 관련 정책 설정에 오류가 있습니다. 시스템 관리자에게 도움을 요청하세요.</translation>
-<translation id="3759645055923345178">설정이 완료되면 PIN 또는 액세스 코드를 입력하여 이 페이지에서 컴퓨터에 액세스할 수 있습니다.</translation>
 <translation id="3776024066357219166">Chrome 원격 데스크톱 세션이 종료되었습니다.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome 원격 데스크톱스으로 액세스할 수 있도록 아래 계정 및 PIN을 확인하세요.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">컴퓨터의 전원 관리 설정을 확인하고 유휴 상태일 때 절전 모드로 전환되도록 설정되지 않았는지 확인하세요.</translation>
 <translation id="7810127880729796595">통계 보기(연결: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">일부 필수 구성요소가 누락되었습니다. Chrome 최신 버전을 실행하고 있는지 확인한 뒤 다시 시도해 주세요.</translation>
-<translation id="7850909060902317210">Chrome 원격 데스크톱 소프트웨어를 설치하고 안내에 따라 설정을 완료합니다.</translation>
 <translation id="7868137160098754906">원격 컴퓨터의 PIN을 입력하세요.</translation>
 <translation id="7869445566579231750">이 애플리케이션을 실행할 수 있는 권한이 없습니다.</translation>
 <translation id="7895403300744144251">원격 컴퓨터의 보안 정책으로 인해 내 계정에서 연결할 수 없습니다.</translation>
diff --git a/remoting/resources/remoting_strings_lt.xtb b/remoting/resources/remoting_strings_lt.xtb
index 19f48ca..171d84e 100644
--- a/remoting/resources/remoting_strings_lt.xtb
+++ b/remoting/resources/remoting_strings_lt.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Neprisijungus.</translation>
 <translation id="3695446226812920698">Sužinokite kaip</translation>
 <translation id="3718805989288361841">Įvyko „Chrome“ nuotolinio kompiuterio valdymo politikos nustatymų klaida. Kreipkitės pagalbos į sistemos administratorių.</translation>
-<translation id="3759645055923345178">Kai sąranka bus baigta, galėsite pasiekti kompiuterį iš šio puslapio įvedę PIN kodą ar prieigos kodą</translation>
 <translation id="3776024066357219166">Baigėsi „Chrome“ nuotolinio kompiuterio valdymo sesija.</translation>
 <translation id="3870154837782082782">„Google Inc.“</translation>
 <translation id="3884839335308961732">Kad leistumėte prieigą naudojant „Chrome“ nuotolinį kompiuterio valdymą, toliau patvirtinkite savo paskyrą ir PIN kodą.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Patikrinkite kompiuterio galios tvarkymo nustatymus ir įsitikinkite, kad jis nėra sukonfigūruotas užmigti neveikos būsenos.</translation>
 <translation id="7810127880729796595">Rodyti statistiką (ryšys: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Trūksta kai kurių būtinų komponentų. Įsitikinkite, kad naudojate naujausios versijos „Chrome“, ir bandykite dar kartą.</translation>
-<translation id="7850909060902317210">Įdiekite „Chrome“ nuotolinio kompiuterio valdymo programinę įrangą ir vadovaudamiesi instrukcijomis užbaikite sąranką</translation>
 <translation id="7868137160098754906">Įveskite nuotolinio kompiuterio PIN kodą.</translation>
 <translation id="7869445566579231750">Neturite leidimo paleisti šią programą.</translation>
 <translation id="7895403300744144251">Pagal nuotolinio kompiuterio saugos politiką neleidžiama prisijungti naudojant jūsų paskyrą.</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb
index 3f0cbd9..6a2bf57 100644
--- a/remoting/resources/remoting_strings_lv.xtb
+++ b/remoting/resources/remoting_strings_lv.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Bezsaistē.</translation>
 <translation id="3695446226812920698">Uzzināt vairāk</translation>
 <translation id="3718805989288361841">Radās kļūda Chrome attālās darbvirsmas politikas iestatījumos. Sazinieties ar sistēmas administratoru, lai saņemtu palīdzību.</translation>
-<translation id="3759645055923345178">Pēc iestatīšanas varēsiet piekļūt datoram no šīs lapas, ievadot PIN vai piekļuves kodu.</translation>
 <translation id="3776024066357219166">Jūsu Chrome attālās darbvirsmas sesija ir pārtraukta.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Lai atļautu piekļuvi, izmantojot Chrome attālo darbvirsmu, lūdzu, apstipriniet kontu un PIN kodu.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Lūdzu, pārbaudiet datora barošanas pārvaldības iestatījumus: datoram ir jābūt konfigurētam tā, lai netiktu aktivizēts miega režīms, kad dators netiek lietots.</translation>
 <translation id="7810127880729796595">Rādīt statistiku (savienojums: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Trūkst dažu nepieciešamo komponentu. Pārbaudiet, vai izmantojat jaunāko Chrome versiju un mēģiniet vēlreiz.</translation>
-<translation id="7850909060902317210">Instalējiet programmatūru “Chrome attālā darbvirsma” un ievērojiet norādījumus, lai pabeigtu iestatīšanu</translation>
 <translation id="7868137160098754906">Lūdzu, ievadiet attālā datora PIN.</translation>
 <translation id="7869445566579231750">Jums nav atļauju, lai palaistu šo lietojumprogrammu.</translation>
 <translation id="7895403300744144251">Drošības politiku dēļ attālajā datorā nav atļauti savienojumi no jūsu konta.</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb
index 1d626e2..3bf0641 100644
--- a/remoting/resources/remoting_strings_ml.xtb
+++ b/remoting/resources/remoting_strings_ml.xtb
@@ -121,7 +121,6 @@
 <translation id="369442766917958684">ഓഫ്‌ലൈൻ.</translation>
 <translation id="3695446226812920698">എങ്ങനെയെന്നറിയുക</translation>
 <translation id="3718805989288361841">Chrome വിദൂര ഡെസ്‌ക്‌ടോപ്പിനായുള്ള നയങ്ങളുടെ ക്രമീകരണത്തിൽ പിശകുണ്ടായി. സഹായത്തിന് നിങ്ങളുടെ സിസ്‌റ്റം അഡ്‌മിനിസ്‌ട്രേറ്ററുമായി ബന്ധപ്പെടുക.</translation>
-<translation id="3759645055923345178">സജ്ജീകരണം പൂർത്തിയാക്കിയതിന് ശേഷം, പിൻ അല്ലെങ്കിൽ ആക്‌സസ് കോഡ് നൽകിക്കൊണ്ട് ഈ പേജിൽ നിന്ന് കമ്പ്യൂട്ടർ ആക്‌സസ് ചെയ്യാനാകും</translation>
 <translation id="3776024066357219166">നിങ്ങളുടെ Chrome വിദൂര ഡെസ്‌ക്‌ടോപ്പ് സെഷന്‍ അവസാനിച്ചു.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome വിദൂര ഡെസ്ക്‌ടോപ്പിലൂടെ ആക്‌സസ്സ് അനുവദിക്കുന്നതിന് ചുവടെയുള്ള നിങ്ങളുടെ അക്കൗണ്ടും PIN-ഉം സ്ഥിരീകരിക്കുക.</translation>
@@ -295,7 +294,6 @@
 <translation id="7782471917492991422">നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ പവർ മാനേജുമെന്റ് ക്രമീകരണങ്ങൾ പരിശോധിച്ച്, നിഷ്‌ക്രിയമായിരിക്കുമ്പോൾ സ്ലീപ്പ് മോഡാകുന്ന തരത്തിൽ കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെന്ന് ഉറപ്പുവരുത്തുക.</translation>
 <translation id="7810127880729796595">സ്ഥിതിവിവരക്കണക്കുകൾ കാണിക്കുക (കണക്ഷൻ: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">ആവശ്യമുള്ള ചില ഘടകങ്ങൾ കാണുന്നില്ല. നിങ്ങൾ Chrome-ന്റെ ഏറ്റവും പുതിയ പതിപ്പ് പ്രവർത്തിക്കുന്നുവെന്ന് ഉറപ്പാക്കി വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="7850909060902317210">Chrome വിദൂര ഡെസ്‌ക്‌ടോപ്പ് സോഫ്‌റ്റ്‌വെയർ ഇൻസ്‌റ്റാൾ ചെയ്യുക, സജ്ജീകരണം പൂർത്തിയാക്കാനുള്ള നിർദ്ദേശങ്ങൾ പാലിക്കുക</translation>
 <translation id="7868137160098754906">വിദൂര കമ്പ്യൂട്ടറിനായി നിങ്ങളുടെ പിൻ നൽകുക.</translation>
 <translation id="7869445566579231750">ഈ അപ്ലിക്കേഷൻ പ്രവർത്തിപ്പിക്കാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.</translation>
 <translation id="7895403300744144251">റിമോട്ട് കമ്പ്യൂട്ടറിലെ സുരക്ഷാ നയങ്ങൾ നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്നുള്ള കണക്ഷനുകളെ അനുവദിക്കുന്നില്ല.</translation>
diff --git a/remoting/resources/remoting_strings_mr.xtb b/remoting/resources/remoting_strings_mr.xtb
index 3ac8e57..292cef1 100644
--- a/remoting/resources/remoting_strings_mr.xtb
+++ b/remoting/resources/remoting_strings_mr.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ऑफलाइन.</translation>
 <translation id="3695446226812920698">कसे ते जाणून घ्या</translation>
 <translation id="3718805989288361841">Chrome रिमोट डेस्कटॉपच्या धोरण सेटिंग्जमध्ये एरर आली आहे. साहाय्यासाठी तुमच्या सिस्टम प्रशसकाशी संपर्क साधा.</translation>
-<translation id="3759645055923345178">सेट अप पूर्ण झाल्यानंतर, तुम्ही पिन किंवा अॅक्सेस कोड टाकून या पेजवरून काँप्युटर अॅक्सेस करू शकाल</translation>
 <translation id="3776024066357219166">आपले Chrome रिमोट डेस्कटॉप सत्र समाप्त झाले आहे.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">कृपया Chrome दूरस्थ डेस्कटॉपद्वारे प्रवेश करण्यास अनुमती देण्यासाठी आपल्या खात्याची आणि पिन ची खाली पुष्टी करा.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">कृपया आपल्या संगणकाची ऊर्जा व्यवस्‍थापन सेटिंग्ज तपासा आणि निष्क्रिय असताना त्या स्लीप मध्‍ये जाण्‍यासाठी कॉन्‍फिगर केल्या नसल्याचे सुनिश्चित करा.</translation>
 <translation id="7810127880729796595">आकडेवारी दर्शवा (कनेक्शन: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">काही आवश्यक घटक गहाळ आहेत. कृपया आपण Chrome ची नवीनतम आवृत्ती चालवत असल्याचे सुनिश्चित करा आणि पुन्हा प्रयत्न करा.</translation>
-<translation id="7850909060902317210">Chrome रिमोट डेस्कटॉप सॉफ्टवेअर इंस्टॉल करा आणि सेटअप पूर्ण करण्यासाठी सूचना फॉलो करा</translation>
 <translation id="7868137160098754906">कृपया दूरस्थ संगणकासाठी आपला पिन एंटर करा.</translation>
 <translation id="7869445566579231750">आपल्याला हा अॅप्लिकेशन चालविण्याची परवानगी नाही.</translation>
 <translation id="7895403300744144251">दूरस्थ संगणकावरील सुरक्षितता धोरणे आपल्या खात्यामधील कनेेक्शनना अनुमती देत नाहीत.</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb
index ab0c371..67287338a 100644
--- a/remoting/resources/remoting_strings_ms.xtb
+++ b/remoting/resources/remoting_strings_ms.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Luar talian.</translation>
 <translation id="3695446226812920698">Ketahui caranya</translation>
 <translation id="3718805989288361841">Terdapat ralat dalam tetapan dasar untuk Desktop Jauh Chrome. Hubungi pentadbir sistem anda untuk mendapatkan bantuan.</translation>
-<translation id="3759645055923345178">Selepas penyediaan selesai, anda akan dapat mengakses komputer itu daripada halaman ini dengan memasukkan PIN atau kod akses</translation>
 <translation id="3776024066357219166">Sesi Desktop Jauh Chrome anda telah tamat.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Sila sahkan akaun dan PIN anda di bawah untuk membenarkan akses melalui Desktop Jauh Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Sila semak tetapan pengurusan kuasa komputer anda dan pastikan bahawa komputer anda tidak dikonfigurasikan untuk tidur apabila melahu.</translation>
 <translation id="7810127880729796595">Tunjukkan statistik (sambungan: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Sesetengah komponen yang diperlukan hilang. Sila pastikan anda menjalankan versi terkini Chrome dan cuba lagi.</translation>
-<translation id="7850909060902317210">Pasang perisian Desktop Jauh Chrome dan ikut arahan untuk melengkapkan penyediaan</translation>
 <translation id="7868137160098754906">Sila masukkan PIN anda untuk komputer jauh.</translation>
 <translation id="7869445566579231750">Anda tidak mempunyai kebenaran untuk menjalankan aplikasi ini.</translation>
 <translation id="7895403300744144251">Dasar keselamatan pada komputer jauh tidak membenarkan sambungan daripada akaun anda.</translation>
diff --git a/remoting/resources/remoting_strings_nl.xtb b/remoting/resources/remoting_strings_nl.xtb
index 87e00c7..2f28e308 100644
--- a/remoting/resources/remoting_strings_nl.xtb
+++ b/remoting/resources/remoting_strings_nl.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Meer informatie</translation>
 <translation id="3718805989288361841">Er is een probleem met de beleidsinstellingen voor Chrome Remote Desktop. Neem contact op met je systeembeheerder voor hulp.</translation>
-<translation id="3759645055923345178">Nadat het instellen is voltooid, kun je vanaf deze pagina toegang krijgen tot de computer door de pincode of toegangscode op te geven</translation>
 <translation id="3776024066357219166">Je Chrome Remote Desktop-sessie is beëindigd.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Bevestig je account en pincode hieronder om toegang door Chrome Remote Desktop toe te staan.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Controleer de instellingen voor energiebeheer van je computer en zorg ervoor dat de slaapstand niet wordt geactiveerd wanneer de computer inactief is.</translation>
 <translation id="7810127880729796595">Statistieken weergeven (verbinding: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Er ontbreken enkele vereiste componenten. Controleer of je de nieuwste versie van Chrome gebruikt en probeer het opnieuw.</translation>
-<translation id="7850909060902317210">Installeer de Chrome Remote Desktop-software en volg de instructies om het instellen te voltooien</translation>
 <translation id="7868137160098754906">Voer je pincode voor de externe computer in.</translation>
 <translation id="7869445566579231750">Je hebt geen toestemming om deze app uit te voeren.</translation>
 <translation id="7895403300744144251">Beveiligingsbeleid op de externe computer staat verbindingen vanuit je account niet toe.</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb
index db88af4..beaa03b 100644
--- a/remoting/resources/remoting_strings_no.xtb
+++ b/remoting/resources/remoting_strings_no.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Utenfor nettet.</translation>
 <translation id="3695446226812920698">Sånn gjør du det</translation>
 <translation id="3718805989288361841">Det er noe feil med innstillingene for retningslinjene for Chrome Eksternt skrivebord. Kontakt systemadministratoren din for å få hjelp.</translation>
-<translation id="3759645055923345178">Når konfigureringen er fullført, kan du bruke datamaskinen fra denne siden ved å skrive inn PIN- eller tilgangskoden</translation>
 <translation id="3776024066357219166">Chrome Eksternt skrivebord-økten din er avsluttet.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Bekreft kontoen og PIN-koden din nedenfor for å tillate tilgang via Chrome Eksternt skrivebord.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Kontrollér datamaskinens strøminnstillinger og sørg for at den ikke er konfigurert til å gå i dvale når den ikke er i bruk.</translation>
 <translation id="7810127880729796595">Vis statistikk (tilkobling: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Det mangler noen nødvendige komponenter. Kontrollér at du kjører den nyeste versjonen av Chrome, og prøv på nytt.</translation>
-<translation id="7850909060902317210">Installer Chrome Eksternt skrivebord-programvaren, og følg veiledningen for å fullføre konfigureringen</translation>
 <translation id="7868137160098754906">Skriv inn PIN-koden for den eksterne datamaskinen.</translation>
 <translation id="7869445566579231750">Du har ikke tillatelse til å kjøre dette programmet.</translation>
 <translation id="7895403300744144251">Sikkerhetsinnstillingene på den eksterne datamaskinen tillater ikke tilkoblinger fra kontoen din.</translation>
diff --git a/remoting/resources/remoting_strings_pl.xtb b/remoting/resources/remoting_strings_pl.xtb
index d32068f..e512c77 100644
--- a/remoting/resources/remoting_strings_pl.xtb
+++ b/remoting/resources/remoting_strings_pl.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Instrukcje</translation>
 <translation id="3718805989288361841">Wystąpił błąd związany z ustawieniami zasad dla Pulpitu zdalnego Chrome. Aby uzyskać pomoc, skontaktuj się z administratorem systemu.</translation>
-<translation id="3759645055923345178">Po zakończeniu konfiguracji będzie można uzyskiwać z tej strony dostęp do komputera poprzez wpisanie kodu PIN lub kodu dostępu.</translation>
 <translation id="3776024066357219166">Sesja Pulpitu zdalnego Chrome została zakończona.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Potwierdź poniżej swoje konto i kod PIN, by pozwolić na dostęp przez Pulpit zdalny Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Sprawdź ustawienia zarządzania zasilaniem komputera i upewnij się, że nie jest on skonfigurowany do przechodzenia podczas bezczynności w tryb uśpienia.</translation>
 <translation id="7810127880729796595">Pokaż statystyki (jakość połączenia: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Brak niektórych wymaganych komponentów. Upewnij się, że korzystasz z najnowszej wersji Chrome, i spróbuj ponownie.</translation>
-<translation id="7850909060902317210">Zainstaluj Pulpit zdalny Chrome i postępuj zgodnie z instrukcją, by ukończyć konfigurację</translation>
 <translation id="7868137160098754906">Wpisz kod PIN komputera zdalnego.</translation>
 <translation id="7869445566579231750">Nie masz uprawnień do uruchamiania tej aplikacji.</translation>
 <translation id="7895403300744144251">Zasady bezpieczeństwa obowiązujące na komputerze zdalnym nie zezwalają na nawiązywanie połączeń z Twojego konta.</translation>
diff --git a/remoting/resources/remoting_strings_pt-BR.xtb b/remoting/resources/remoting_strings_pt-BR.xtb
index 0dfba704..3f4131b 100644
--- a/remoting/resources/remoting_strings_pt-BR.xtb
+++ b/remoting/resources/remoting_strings_pt-BR.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Off-line.</translation>
 <translation id="3695446226812920698">Saiba como</translation>
 <translation id="3718805989288361841">Ocorreu um erro nas configurações de políticas da Área de trabalho remota do Google Chrome. Entre em contato com o administrador do sistema para receber ajuda.</translation>
-<translation id="3759645055923345178">Depois de concluir a configuração, você conseguirá acessar o computador a partir desta página inserindo o PIN ou o código de acesso</translation>
 <translation id="3776024066357219166">Sua sessão na Área de trabalho remota do Google Chrome foi encerrada.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Confirme sua conta e seu PIN abaixo para permitir acesso pela Área de trabalho remota do Google Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Verifique as configurações de gerenciamento de energia de seu computador para garantir que ele não esteja configurado para entrar em modo de espera quando estiver inativo.</translation>
 <translation id="7810127880729796595">Mostrar estatísticas (conexão: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Alguns componentes obrigatórios não foram encontrados. Certifique-se de que você esteja executando a última versão do Google Chrome e tente novamente.</translation>
-<translation id="7850909060902317210">Instale o software Área de trabalho remota do Google Chrome e siga as instruções para concluir a configuração</translation>
 <translation id="7868137160098754906">Digite seu PIN do computador remoto.</translation>
 <translation id="7869445566579231750">Você não tem permissão para executar este aplicativo.</translation>
 <translation id="7895403300744144251">As políticas de segurança no computador remoto não permitem conexões a partir da sua conta.</translation>
diff --git a/remoting/resources/remoting_strings_pt-PT.xtb b/remoting/resources/remoting_strings_pt-PT.xtb
index ea558c8..97cd23d 100644
--- a/remoting/resources/remoting_strings_pt-PT.xtb
+++ b/remoting/resources/remoting_strings_pt-PT.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Saiba como</translation>
 <translation id="3718805989288361841">As definições de política do Ambiente de Trabalho Remoto do Chrome têm um erro. Contacte o seu gestor de sistema para obter assistência.</translation>
-<translation id="3759645055923345178">Quando a configuração estiver concluída, pode aceder ao computador a partir desta página ao introduzir o PIN ou o código de acesso.</translation>
 <translation id="3776024066357219166">A sessão do Ambiente de Trabalho Remoto do Chrome terminou.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Confirme a sua conta e PIN abaixo para permitir o acesso do Ambiente de Trabalho Remoto do Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Verifique as definições de gestão de energia do computador e certifique-se de que não está configurado para suspender quando inativo.</translation>
 <translation id="7810127880729796595">Mostrar estatísticas (ligação: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Faltam alguns componentes necessários. Certifique-se de que está a executar a versão mais recente do Chrome e tente novamente.</translation>
-<translation id="7850909060902317210">Instale o software Ambiente de Trabalho Remoto do Chrome e siga as instruções para concluir a configuração.</translation>
 <translation id="7868137160098754906">Introduza o PIN para o computador remoto.</translation>
 <translation id="7869445566579231750">Não tem autorização para executar esta aplicação.</translation>
 <translation id="7895403300744144251">As políticas de segurança do computador remoto não permitem ligações a partir da sua conta.</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb
index 6fdad21f..d0655b6 100644
--- a/remoting/resources/remoting_strings_ro.xtb
+++ b/remoting/resources/remoting_strings_ro.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Află cum</translation>
 <translation id="3718805989288361841">A apărut o eroare la setările politicii pentru Desktop la distanță Chrome. Contactează administratorul de sistem pentru asistență.</translation>
-<translation id="3759645055923345178">După ce ai terminat configurarea, vei putea accesa computerul din această pagină, introducând codul PIN sau codul de acces</translation>
 <translation id="3776024066357219166">Sesiunea Desktop la distanță Chrome s-a încheiat.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Confirmați mai jos contul și codul PIN pentru a permite accesarea prin intermediul aplicației Desktop la distanță Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Verificați setările de gestionare a energiei pentru computerul dvs. și asigurați-vă că nu este configurat să treacă în modul inactiv când este în repaus.</translation>
 <translation id="7810127880729796595">Afișează statisticile (conexiune: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Unele componente necesare lipsesc. Asigură-te că rulezi cea mai recentă versiune Chrome și încearcă din nou.</translation>
-<translation id="7850909060902317210">Instalează software-ul Desktop la distanță Chrome și urmează instrucțiunile pentru a finaliza configurarea</translation>
 <translation id="7868137160098754906">Introduceți codul PIN pentru computerul la distanță.</translation>
 <translation id="7869445566579231750">Nu ai permisiunea să rulezi această aplicație.</translation>
 <translation id="7895403300744144251">Politicile de securitate de pe computerul la distanță nu permit conexiunile din contul tău.</translation>
diff --git a/remoting/resources/remoting_strings_ru.xtb b/remoting/resources/remoting_strings_ru.xtb
index 656dd77..b36eb7c 100644
--- a/remoting/resources/remoting_strings_ru.xtb
+++ b/remoting/resources/remoting_strings_ru.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Офлайн.</translation>
 <translation id="3695446226812920698">Подробнее</translation>
 <translation id="3718805989288361841">При настройке правил для Удаленного рабочего стола Chrome произошла ошибка. Обратитесь за помощью к системному администратору.</translation>
-<translation id="3759645055923345178">После этого вы сможете подключаться к компьютеру с этой страницы, вводя PIN-код или код доступа.</translation>
 <translation id="3776024066357219166">Сеанс Удаленного рабочего стола Chrome завершен.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Для доступа через Удаленный рабочий стол Chrome подтвердите свой аккаунт и PIN-код.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Отключите в настройках энергопотребления компьютера функцию перехода в спящий режим при отсутствии активности.</translation>
 <translation id="7810127880729796595">Показать статистику (качество подключения: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Отсутствуют некоторые необходимые компоненты. Установите последнюю версию браузера Chrome и повторите попытку.</translation>
-<translation id="7850909060902317210">Установите и настройте программу "Удаленный рабочий стол Chrome", следуя инструкциям.</translation>
 <translation id="7868137160098754906">Введите PIN-код для доступа к удаленному компьютеру.</translation>
 <translation id="7869445566579231750">У вас нет разрешения на запуск этого приложения.</translation>
 <translation id="7895403300744144251">Правила безопасности на удаленном компьютере запрещают подключение из вашего аккаунта.</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb
index 23a8999..3cfe3f50 100644
--- a/remoting/resources/remoting_strings_sk.xtb
+++ b/remoting/resources/remoting_strings_sk.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Ako na to</translation>
 <translation id="3718805989288361841">V súvislosti s nastaveniami pravidiel pre Vzdialenú plochu Chrome sa vyskytla chyba. Požiadajte o pomoc správcu systému.</translation>
-<translation id="3759645055923345178">Po dokončení nastavenia budete môcť používať daný počítač prostredníctvom tejto stránky po zadaní kódu PIN alebo prístupového kódu</translation>
 <translation id="3776024066357219166">Vaša relácia Vzdialenej plochy Chrome bola ukončená.</translation>
 <translation id="3870154837782082782">Spoločnosť Google Inc.</translation>
 <translation id="3884839335308961732">Ak chcete povoliť prístup k Vzdialenej ploche Chrome, potvrďte svoj účet a kód PIN nižšie.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Skontrolujte nastavenia správy napájania svojho počítača a uistite sa, že nie je nakonfigurovaný prechod do režimu spánku pri nečinnosti.</translation>
 <translation id="7810127880729796595">Zobraziť štatistiky (pripojenie: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Niektoré potrebné komponenty chýbajú. Uistite sa, že používate najnovšiu verziu prehliadača Chrome a skúste to znova.</translation>
-<translation id="7850909060902317210">Nainštalujte si softvér Vzdialená plocha Chrome a dokončite nastavenie podľa uvedených pokynov</translation>
 <translation id="7868137160098754906">Zadajte číslo PIN pre vzdialený počítač.</translation>
 <translation id="7869445566579231750">Nemáte povolenie spustiť túto aplikáciu.</translation>
 <translation id="7895403300744144251">Pravidlá zabezpečenia vzdialeného počítača nepovoľujú pripojenia z vášho účtu.</translation>
diff --git a/remoting/resources/remoting_strings_sl.xtb b/remoting/resources/remoting_strings_sl.xtb
index 550c9d35..487e887 100644
--- a/remoting/resources/remoting_strings_sl.xtb
+++ b/remoting/resources/remoting_strings_sl.xtb
@@ -120,7 +120,6 @@
 <translation id="369442766917958684">Brez povezave.</translation>
 <translation id="3695446226812920698">Oglejte si navodila</translation>
 <translation id="3718805989288361841">Napaka z nastavitvami pravilnika za Oddaljeno namizje Chrome. Če želite pomoč, se obrnite na sistemskega skrbnika.</translation>
-<translation id="3759645055923345178">Po končani nastavitvi boste lahko dostopali do računalnika na tej strani tako, da boste vnesli PIN ali kodo za dostop</translation>
 <translation id="3776024066357219166">Seja Oddaljenega namizja za Chrome je končana.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Če želite dovoliti dostop prek Oddaljenega namizja za Chrome, spodaj potrdite račun in PIN.</translation>
@@ -283,7 +282,6 @@
 <translation id="7782471917492991422">Preverite nastavitve računalnika za upravljanje porabe in zagotovite, da za čas nedejavnosti ni določeno stanje pripravljenosti.</translation>
 <translation id="7810127880729796595">Prikaži statistične podatke (povezava: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Ni nekaterih zahtevanih delov. Preverite, ali imate najnovejšo različico Chroma in poskusite znova.</translation>
-<translation id="7850909060902317210">Namestite programsko opremo za Oddaljeno namizje za Chrome in upoštevajte navodila za dokončanje nastavitve</translation>
 <translation id="7868137160098754906">Vnesite PIN za oddaljeni računalnik.</translation>
 <translation id="7869445566579231750">Nimate dovoljenja za izvajanje te aplikacije.</translation>
 <translation id="7895403300744144251">Varnostni pravilniki na oddaljenem računalniku ne dovoljujejo povezav iz vašega računa.</translation>
diff --git a/remoting/resources/remoting_strings_sr.xtb b/remoting/resources/remoting_strings_sr.xtb
index 85fb751..67ce16c 100644
--- a/remoting/resources/remoting_strings_sr.xtb
+++ b/remoting/resources/remoting_strings_sr.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Офлајн је.</translation>
 <translation id="3695446226812920698">Сазнајте како</translation>
 <translation id="3718805989288361841">Дошло је до грешке до са подешавањима смерница за Chrome удаљени рачунар. Контактирајте администратора система да бисте добили помоћ.</translation>
-<translation id="3759645055923345178">Када завршите подешавање, моћи ћете да приступате рачунару са ове странице тако што ћете унети PIN или приступни кôд</translation>
 <translation id="3776024066357219166">Сесија Chrome удаљеног рачунара је завршена.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Потврдите налог и PIN у наставку да бисте омогућили приступ за Chrome удаљени рачунар.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Проверите подешавања за управљање напајањем рачунара и уверите се да није конфигурисан тако да прелази у режим спавања када је неактиван.</translation>
 <translation id="7810127880729796595">Прикажи статистику (веза: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Недостају неке неопходне компоненте. Проверите да ли користите најновију верзију Chrome-а и покушајте поново.</translation>
-<translation id="7850909060902317210">Инсталирајте софтвер Chrome удаљени рачунар и пратите упутства да бисте довршили подешавање</translation>
 <translation id="7868137160098754906">Унесите PIN за удаљени рачунар.</translation>
 <translation id="7869445566579231750">Немате дозволу за покретање ове апликације.</translation>
 <translation id="7895403300744144251">Смернице за безбедност на удаљеном рачунару не дозвољавају везе са вашег налога.</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb
index de463b6..74bb5d4c 100644
--- a/remoting/resources/remoting_strings_sv.xtb
+++ b/remoting/resources/remoting_strings_sv.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Läs mer</translation>
 <translation id="3718805989288361841">Det finns ett fel i principinställningarna för Chrome Remote Desktop. Kontakta systemadministratören om du behöver hjälp.</translation>
-<translation id="3759645055923345178">När konfigureringen är klar kan du ansluta till datorn via den här sidan genom att ange pinkoden eller åtkomstkoden</translation>
 <translation id="3776024066357219166">Chrome Remote Desktop-sessionen har avslutats.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Bekräfta ditt konto och pinkoden nedan för att tillåta åtkomst via Chrome Remote Desktop.</translation>
@@ -298,7 +297,6 @@
 <translation id="7782471917492991422">Kontrollera datorns inställningar för energisparfunktioner och se till att den inte försätts i viloläge vid inaktivitet.</translation>
 <translation id="7810127880729796595">Visa statistik (anslutning: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Vissa obligatoriska komponenter saknas. Kontrollera att du kör den senaste versionen av Chrome och försök igen.</translation>
-<translation id="7850909060902317210">Installera Chrome Remote Desktop och slutför konfigureringen enligt anvisningarna</translation>
 <translation id="7868137160098754906">Ange din pinkod för fjärrdatorn.</translation>
 <translation id="7869445566579231750">Du har inte behörighet att köra den här appen.</translation>
 <translation id="7895403300744144251">Fjärrdatorns säkerhetspolicy tillåter inte anslutningar från ditt konto.</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb
index 9434584..e1de9101 100644
--- a/remoting/resources/remoting_strings_sw.xtb
+++ b/remoting/resources/remoting_strings_sw.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Nje ya mtandao.</translation>
 <translation id="3695446226812920698">Pata maelezo</translation>
 <translation id="3718805989288361841">Kuna hitilafu ya mipangilio ya sera ya Programu ya Chrome ya Ufikiaji wa Kompyuta kutoka Mbali.  Wasiliana na msimamizi wako ili upate usaidizi.</translation>
-<translation id="3759645055923345178">Baada ya kukamilisha shughuli ya kuweka mipangilio, utaweza kufikia kompyuta kwenye ukurasa huu kwa kuweka PIN au nambari ya kufikia</translation>
 <translation id="3776024066357219166">Kipindi chako cha Eneo-kazi la Mbali la Chrome kimekamilika.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Tafadhali thibitisha akaunti yako na PIN hapa chini ili kuruhusu ufikiaji kwa Kompyuta ya Mbali ya Chrome</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Tafadhali kagua mipangilio ya usimamizi wa nishati wa kompyuta yako na uhakikishe kuwa haijasanidiwa kulala  inapokuwa haifanyi kitu.</translation>
 <translation id="7810127880729796595">Onyesha takwimu (muunganisho: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Baadhi ya vipengele vinavyohitajika havipo. Tafadhali hakikisha kuwa unatumia toleo jipya la Chrome na ujaribu tena.</translation>
-<translation id="7850909060902317210">Sakinisha Programu ya Chrome ya Ufikiaji wa Kompyuta kutoka Mbali kisha ufuate maagizo ili ukamilishe shughuli ya kuweka mipangilio</translation>
 <translation id="7868137160098754906">Tafadhali weka PIN yako ya kompyuta ya mbali.</translation>
 <translation id="7869445566579231750">Huna ruhusa ya kuendesha programu hii.</translation>
 <translation id="7895403300744144251">Sera za faragha kuhusu kompyuta ya mbali haziruhusu miunganisho kutoka akaunti yako.</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb
index bf3096e..4626edb 100644
--- a/remoting/resources/remoting_strings_ta.xtb
+++ b/remoting/resources/remoting_strings_ta.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ஆஃப்லைன்.</translation>
 <translation id="3695446226812920698">எப்படி என அறிக</translation>
 <translation id="3718805989288361841">Chrome தொலைநிலை டெஸ்க்டாப்பிற்கான கொள்கை அமைப்புகளில் பிழை ஏற்பட்டது. உதவிக்கு, உங்கள் சாதன நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
-<translation id="3759645055923345178">அமைக்கப்பட்டதும், பின் அல்லது அணுகல் குறியீட்டை உள்ளிட்டு, இந்தப் பக்கத்திலிருந்து கணினியை அணுகவும்</translation>
 <translation id="3776024066357219166">உங்கள் Chrome தொலைநிலை டெஸ்க்டாப் அமர்வு முடிந்தது.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome தொலைநிலை டெஸ்க்டாப் மூலம் அணுகலை அனுமதிக்க, கீழே உங்கள் கணக்கையும், PIN ஐயும் உறுதிப்படுத்தவும்.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">உங்கள் கணினியின் சக்தி நிர்வகிப்பு அமைப்புகளைச் சரிபார்த்து, அது செயலற்று இருக்கும்போது முடங்குமாறு உள்ளமைக்கப்படவில்லை என்பதை உறுதி செய்யவும்.</translation>
 <translation id="7810127880729796595">புள்ளிவிவரங்களைக் காட்டு (இணைப்பு: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">தேவையான சில உறுப்புகள் காணவில்லை. Chrome இன் சமீபத்திய பதிப்பைத் தான் இயக்குகிறீர்கள் என்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.</translation>
-<translation id="7850909060902317210">அமைவை முடிக்க, Chrome தொலைநிலை டெஸ்க்டாப் மென்பொருளை நிறுவி, வழிமுறைகளைப் பின்பற்றவும்</translation>
 <translation id="7868137160098754906">தொலைநிலைக் கணினிக்கான உங்கள் PIN ஐ உள்ளிடவும்.</translation>
 <translation id="7869445566579231750">இந்தப் பயன்பாட்டை இயக்குவதற்கான அனுமதி உங்களுக்கு இல்லை.</translation>
 <translation id="7895403300744144251">தொலைநிலைக் கணினியில் உள்ள பாதுகாப்புக் கொள்கைகள், உங்கள் கணக்கிலிருந்து இணைப்புகளை அனுமதிக்காது.</translation>
diff --git a/remoting/resources/remoting_strings_te.xtb b/remoting/resources/remoting_strings_te.xtb
index 6585ee86..fd867d4 100644
--- a/remoting/resources/remoting_strings_te.xtb
+++ b/remoting/resources/remoting_strings_te.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ఆఫ్‌లైన్‌లో ఉన్నారు.</translation>
 <translation id="3695446226812920698">ఎలాగో తెలుసుకోండి</translation>
 <translation id="3718805989288361841">Chrome రిమోట్ డెస్క్‌టాప్ యొక్క విధాన సెట్టింగ్‌లలో లోపం ఉంది. సహాయం కావాలంటే మీ సిస్టమ్ నిర్వాహకులను సంప్రదించండి.</translation>
-<translation id="3759645055923345178">సెటప్ పూర్తయిన తర్వాత, మీరు పిన్ లేదా యాక్సెస్ కోడ్‌ని నమోదు చేయడం ద్వారా ఈ పేజీ నుండి కంప్యూటర్‌ని యాక్సెస్ చేయవచ్చు</translation>
 <translation id="3776024066357219166">మీ Chrome రిమోట్ డెస్క్‌టాప్ సెషన్ ముగిసింది.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">దయచేసి Chrome రిమోట్ డెస్క్‌టాప్ ద్వారా ప్రాప్యతను అనుమతించడానికి దిగువ మీ ఖాతా మరియు PINను నిర్ధారించండి.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">దయచేసి మీ కంప్యూటర్ యొక్క విద్యుత్ నిర్వహణ సెట్టింగ్‌లను తనిఖీ చేసి, ఇది నిష్క్రియంగా ఉన్నప్పుడు నిద్రావస్థలోకి వెళ్లేలా కాన్ఫిగర్ చేయబడలేదని నిర్ధారించుకోండి.</translation>
 <translation id="7810127880729796595">గణాంకాలను చూపు (కనెక్షన్: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">కొన్ని ఆవశ్యక అంశాలు లేవు. దయచేసి మీరు తాజా Chrome సంస్కరణను అమలు చేస్తున్నారని నిర్ధారించుకొని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="7850909060902317210">Chrome రిమోట్ డెస్క్‌టాప్ సాఫ్ట్‌వేర్‌ని ఇన్‌స్టాల్ చేసి, సూచనలను అనుసరించడం ద్వారా సెటప్‌ని పూర్తి చేయండి</translation>
 <translation id="7868137160098754906">దయచేసి రిమోట్ కంప్యూటర్ కోసం మీ PINను నమోదు చేయండి.</translation>
 <translation id="7869445566579231750">ఈ అనువర్తనాన్ని అమలు చేయడానికి మీకు అనుమతి లేదు.</translation>
 <translation id="7895403300744144251">రిమోట్ కంప్యూటర్‌లోని భద్రతా విధానాలు మీ ఖాతా నుండి కనెక్షన్‌లను అనుమతించవు.</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb
index b1a4fed..1270e01 100644
--- a/remoting/resources/remoting_strings_th.xtb
+++ b/remoting/resources/remoting_strings_th.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">ออฟไลน์</translation>
 <translation id="3695446226812920698">เรียนรู้วิธี</translation>
 <translation id="3718805989288361841">การตั้งค่านโยบายของ Chrome Remote Desktop มีข้อผิดพลาด โปรดติดต่อขอรับความช่วยเหลือจากผู้ดูแลระบบของคุณ</translation>
-<translation id="3759645055923345178">หลังจากตั้งค่าเสร็จ คุณจะเข้าถึงคอมพิวเตอร์ได้จากหน้านี้ได้โดยการป้อน PIN หรือรหัสการเข้าถึง</translation>
 <translation id="3776024066357219166">เซสชัน Chrome Remote Desktop ของคุณสิ้นสุดแล้ว</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">โปรดยืนยันบัญชีและ PIN ของคุณด้านล่างเพื่ออนุญาตให้ Chrome Remote Desktop สามารถเข้าถึง</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">โปรดตรวจสอบการตั้งค่าการจัดการพลังงานของคอมพิวเตอร์ที่ใช้ และตรวจสอบให้แน่ใจว่าไม่ได้กำหนดค่าให้เข้าสู่โหมดสลีปเมื่อไม่มีการใช้งาน</translation>
 <translation id="7810127880729796595">แสดงสถิติ (การเชื่อมต่อ: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">คอมโพเนนต์ที่จำเป็นบางอย่างขาดหายไป โปรดตรวจสอบว่าคุณใช้ Chrome เวอร์ชันล่าสุดและลองอีกครั้ง</translation>
-<translation id="7850909060902317210">ติดตั้งซอฟต์แวร์ Chrome Remote Desktop แล้วทำตามวิธีการติดตั้งให้เสร็จสมบูรณ์</translation>
 <translation id="7868137160098754906">โปรดป้อน PIN สำหรับคอมพิวเตอร์ระยะไกล</translation>
 <translation id="7869445566579231750">คุณไม่มีสิทธิ์ในการเรียกใช้แอปพลิเคชันนี้</translation>
 <translation id="7895403300744144251">นโยบายการรักษาความปลอดภัยของคอมพิวเตอร์ระยะไกลไม่อนุญาตให้มีการเชื่อมต่อจากบัญชีของคุณ</translation>
diff --git a/remoting/resources/remoting_strings_tr.xtb b/remoting/resources/remoting_strings_tr.xtb
index 791bfdf1..b8024a1 100644
--- a/remoting/resources/remoting_strings_tr.xtb
+++ b/remoting/resources/remoting_strings_tr.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Çevrimdışı.</translation>
 <translation id="3695446226812920698">Nasıl yapacağınızı öğrenin</translation>
 <translation id="3718805989288361841">Chrome Uzaktan Masaüstü politika ayarında bir hata oluştu. Yardım için sistem yöneticinizle görüşün.</translation>
-<translation id="3759645055923345178">Kurulum tamamlandıktan sonra PIN veya erişim kodunu girerek bilgisayara bu sayfadan erişebilirsiniz</translation>
 <translation id="3776024066357219166">Chrome Uzaktan Masaüstü oturumunuz sonlandı.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Chrome Uzaktan Masaüstü tarafından erişime izin vermek için lütfen aşağıda hesabınızı ve PIN kodunuzu onaylayın.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Lütfen bilgisayarınızın güç yönetimi ayarlarını kontrol edin ve boşta kaldığında uyku moduna geçecek şekilde ayarlanmadığından emin olun.</translation>
 <translation id="7810127880729796595">İstatistikleri göster (bağlantı: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Bazı gerekli bileşenler eksik. Lütfen Google Chrome'un son sürümünü çalıştırdığınızdan emin olun ve tekrar deneyin.</translation>
-<translation id="7850909060902317210">Chrome Uzaktan Masaüstü yazılımını yükleyin ve kurulumu tamamlamak için talimatları uygulayın</translation>
 <translation id="7868137160098754906">Lütfen uzak bilgisayara ilişkin PIN'inizi girin.</translation>
 <translation id="7869445566579231750">Bu uygulamayı çalıştırmak için izniniz yok.</translation>
 <translation id="7895403300744144251">Uzak bilgisayardaki güvenlik politikaları, hesabınızdan bağlantı yapılmasına izin vermiyor.</translation>
diff --git a/remoting/resources/remoting_strings_uk.xtb b/remoting/resources/remoting_strings_uk.xtb
index cb8bb48..d70a94e6 100644
--- a/remoting/resources/remoting_strings_uk.xtb
+++ b/remoting/resources/remoting_strings_uk.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Офлайн.</translation>
 <translation id="3695446226812920698">Докладніше</translation>
 <translation id="3718805989288361841">Сталася помилка в налаштуваннях правил Віддаленого керування Chrome. Зверніться по допомогу до свого системного адміністратора.</translation>
-<translation id="3759645055923345178">Коли налаштування завершиться, ви зможете отримувати доступ до комп’ютера з цієї сторінки за допомогою PIN-коду або коду доступу</translation>
 <translation id="3776024066357219166">Сеанс програми Віддалене керування Chrome закінчено.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Підтвердьте свій обліковий запис і PIN-код нижче, щоб дозволити Віддалене керування Chrome.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Перевірте параметри керування живленням комп’ютера та переконайтеся, що його не налаштовано переходити в режим сну, якщо він неактивний.</translation>
 <translation id="7810127880729796595">Показати статистику (з’єднання: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Немає деяких обов’язкових компонентів. Переконайтеся, що у вас найновіша версія Chrome, і повторіть спробу.</translation>
-<translation id="7850909060902317210">Установіть програму Віддалене керування Chrome і виконайте вказівки, щоб завершити налаштування</translation>
 <translation id="7868137160098754906">Введіть PIN-код для віддаленого комп’ютера.</translation>
 <translation id="7869445566579231750">У вас немає дозволу запускати цей додаток.</translation>
 <translation id="7895403300744144251">Правила безпеки віддаленого комп’ютера блокують з’єднання з вашого облікового запису.</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb
index baa83ee2..b6da91ba 100644
--- a/remoting/resources/remoting_strings_vi.xtb
+++ b/remoting/resources/remoting_strings_vi.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">Ngoại tuyến.</translation>
 <translation id="3695446226812920698">Tìm hiểu cách thức</translation>
 <translation id="3718805989288361841">Đã xảy ra lỗi với cài đặt chính sách cho Chrome Remote Desktop. Hãy liên hệ với quản trị viên hệ thống của bạn để được hỗ trợ.</translation>
-<translation id="3759645055923345178">Sau khi thiết lập xong, bạn có thể truy cập vào máy tính từ trang này bằng cách nhập mã PIN hoặc mã truy cập</translation>
 <translation id="3776024066357219166">Phiên Chrome Remote Desktop của bạn đã kết thúc.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">Vui lòng xác nhận tài khoản và mã PIN của bạn bên dưới để cho phép Chrome Remote Desktop truy cập.</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">Vui lòng kiểm tra cài đặt quản lý nguồn máy tính của bạn và đảm bảo rằng máy tính không được định cấu hình để ngủ khi không hoạt động.</translation>
 <translation id="7810127880729796595">Hiển thị số liệu thống kê (kết nối: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">Thiếu một số thành phần bắt buộc. Vui lòng đảm bảo rằng bạn đang chạy phiên bản Chrome mới nhất và thử lại.</translation>
-<translation id="7850909060902317210">Cài đặt phần mềm Chrome Remote Desktop và làm theo hướng dẫn để hoàn tất quá trình thiết lập</translation>
 <translation id="7868137160098754906">Hãy nhập mã PIN của bạn cho máy tính từ xa.</translation>
 <translation id="7869445566579231750">Bạn không có quyền chạy ứng dụng này.</translation>
 <translation id="7895403300744144251">Chính sách bảo mật trên máy tính từ xa không cho phép các kết nối từ tài khoản của bạn.</translation>
diff --git a/remoting/resources/remoting_strings_zh-CN.xtb b/remoting/resources/remoting_strings_zh-CN.xtb
index 12752c7..1f0f6c6 100644
--- a/remoting/resources/remoting_strings_zh-CN.xtb
+++ b/remoting/resources/remoting_strings_zh-CN.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">离线。</translation>
 <translation id="3695446226812920698">如何解决</translation>
 <translation id="3718805989288361841">Chrome 远程桌面的政策设置有误。请与您的系统管理员联系寻求帮助。</translation>
-<translation id="3759645055923345178">设置完毕后,您只需输入相应的 PIN 码或访问代码,便可从此页面访问这台计算机</translation>
 <translation id="3776024066357219166">您的 Chrome 远程桌面会话已结束。</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">请在下方确认您的帐号和 PIN,以便允许通过 Chrome 远程桌面进行访问。</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">请检查您的计算机电源管理设置,确保未将该设置配置为无操作时进入休眠模式。</translation>
 <translation id="7810127880729796595">显示统计信息(连接:<ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">缺少某些必需的组件。请确保您运行的是最新版本的 Chrome,然后重试。</translation>
-<translation id="7850909060902317210">安装“Chrome 远程桌面”软件,并按照说明完成设置</translation>
 <translation id="7868137160098754906">请为远程计算机输入PIN码。</translation>
 <translation id="7869445566579231750">您无权运行该应用。</translation>
 <translation id="7895403300744144251">这台远程计算机的安全政策不允许从您的帐号进行连接。</translation>
diff --git a/remoting/resources/remoting_strings_zh-TW.xtb b/remoting/resources/remoting_strings_zh-TW.xtb
index c48c3b5..550fa44 100644
--- a/remoting/resources/remoting_strings_zh-TW.xtb
+++ b/remoting/resources/remoting_strings_zh-TW.xtb
@@ -122,7 +122,6 @@
 <translation id="369442766917958684">離線。</translation>
 <translation id="3695446226812920698">操作說明</translation>
 <translation id="3718805989288361841">Chrome 遠端桌面的政策設定有誤。如需協助,請與系統管理員聯絡。</translation>
-<translation id="3759645055923345178">設定完成後,只要輸入 PIN 碼或存取碼,即可透過這個頁面存取該電腦</translation>
 <translation id="3776024066357219166">你的 Chrome 遠端桌面工作階段已結束。</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3884839335308961732">請在下方確認你的帳戶和 PIN,以便授予 Chrome 遠端桌面存取權限。</translation>
@@ -296,7 +295,6 @@
 <translation id="7782471917492991422">請檢查電腦的電源管理設定,確認電腦在閒置時不會進入休眠狀態。</translation>
 <translation id="7810127880729796595">顯示統計資料 (連線品質:<ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">找不到部分必要元件。請確認您執行的是最新版本的 Chrome,然後再試一次。</translation>
-<translation id="7850909060902317210">安裝 Chrome 遠端桌面軟體,並按照操作說明完成設定程序</translation>
 <translation id="7868137160098754906">請為遠端電腦輸入你的 PIN。</translation>
 <translation id="7869445566579231750">您沒有執行這個應用程式的權限。</translation>
 <translation id="7895403300744144251">遠端電腦的安全性政策禁止從您的帳戶連線。</translation>
diff --git a/services/viz/privileged/interfaces/compositing/BUILD.gn b/services/viz/privileged/interfaces/compositing/BUILD.gn
index 63c7154..e8b8c4f8 100644
--- a/services/viz/privileged/interfaces/compositing/BUILD.gn
+++ b/services/viz/privileged/interfaces/compositing/BUILD.gn
@@ -20,6 +20,7 @@
     "//media/mojo/interfaces:interfaces",
     "//mojo/public/mojom/base",
     "//services/viz/public/interfaces",
+    "//skia/public/interfaces",
     "//ui/gfx/geometry/mojo",
     "//ui/gfx/mojo",
     "//ui/latency/mojo:interfaces",
diff --git a/services/viz/privileged/interfaces/compositing/frame_sink_video_capture.mojom b/services/viz/privileged/interfaces/compositing/frame_sink_video_capture.mojom
index 8bcd4e4..325d6a3 100644
--- a/services/viz/privileged/interfaces/compositing/frame_sink_video_capture.mojom
+++ b/services/viz/privileged/interfaces/compositing/frame_sink_video_capture.mojom
@@ -8,6 +8,7 @@
 import "media/mojo/interfaces/media_types.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "services/viz/public/interfaces/compositing/frame_sink_id.mojom";
+import "skia/public/interfaces/bitmap.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 
 // Provided with each call to FrameSinkVideoConsumer::OnFrameCaptured() so that
@@ -129,4 +130,30 @@
   // Requests the capturer send a duplicate of the last frame. This is used to
   // resolve occasional "picture loss" issues consumer-side.
   RequestRefreshFrame();
+
+  // Creates an overlay to be renderered within each captured video frame. The
+  // |stacking_index| is an arbitrary value that determines whether to render
+  // this overlay before/after other overlays. Greater values mean "after" and
+  // "on top of" those with lesser values. Specifying the same index as an
+  // existing overlay will cause the existing one to be dropped and replaced
+  // with a new one.
+  CreateOverlay(int32 stacking_index, FrameSinkVideoCaptureOverlay& request);
+};
+
+// Control interface for a small image to be composited on top of each captured
+// video frame. This allows clients to, for example, have the capturer render
+// mouse cursors or debug info boxes on top of the captured content.
+interface FrameSinkVideoCaptureOverlay {
+  // Sets/Changes the overlay |image| and its position and size, relative to the
+  // source content. |bounds| consists of coordinates where the range [0.0,1.0)
+  // indicates the relative position+size within the bounds of the source
+  // content (e.g., 0.0 refers to the top or left edge; 1.0 to just after the
+  // bottom or right edge). Pass empty |bounds| to temporarily hide the overlay
+  // until a later call to SetBounds().
+  SetImageAndBounds(skia.mojom.Bitmap image, gfx.mojom.RectF bounds);
+
+  // Changes the bounds of the previously-set image, showing the overlay if
+  // non-empty bounds are provided, and hiding the overlay otherwise. |bounds|
+  // has the same semantics as described in ShowImageAt().
+  SetBounds(gfx.mojom.RectF bounds);
 };
diff --git a/testing/buildbot/chromium.json b/testing/buildbot/chromium.json
index fcdd1ed..1af50c5 100644
--- a/testing/buildbot/chromium.json
+++ b/testing/buildbot/chromium.json
@@ -1,56 +1,6 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
   "AAAAA2 See generate_buildbot_json.py to make changes": {},
-  "Linux x64": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "args": [
-          "linux-release-64/sizes"
-        ],
-        "name": "sizes",
-        "script": "sizes.py"
-      }
-    ]
-  },
-  "Mac": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "args": [
-          "mac-release/sizes"
-        ],
-        "name": "sizes",
-        "script": "sizes.py"
-      }
-    ]
-  },
-  "Win": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "name": "checkbins",
-        "script": "checkbins.py"
-      }
-    ]
-  },
-  "Win x64": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "name": "checkbins",
-        "script": "checkbins.py"
-      }
-    ]
-  },
   "android-rel": {
     "additional_compile_targets": [
       "all"
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter
index 141982e..265253b9 100644
--- a/testing/buildbot/filters/mash.browser_tests.filter
+++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -36,9 +36,12 @@
 
 # The browser frame is a work in progress.
 -BrowserNonClientFrameViewAshBackButtonTest.*
+-BrowserNonClientFrameViewAshTest.ActiveStateOfButtonMatchesWidget/*
 -BrowserNonClientFrameViewAshTest.AvatarDisplayOnTeleportedWindow/*
 -BrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/*
 -BrowserNonClientFrameViewAshTest.ImmersiveModeTopViewInset/*
+-BrowserNonClientFrameViewAshTest.IncognitoAvatar/*
+-BrowserNonClientFrameViewAshTest.IncognitoMarkedAsAssistantBlocked/*
 -BrowserNonClientFrameViewAshTest.RestoreMinimizedBrowserUpdatesCaption/*
 -BrowserNonClientFrameViewAshTest.ToggleTabletModeOnMinimizedWindow/*
 -BrowserNonClientFrameViewAshTest.ToggleTabletModeRelayout/*
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index c6f0ba6..ea71c1d3 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -748,12 +748,6 @@
       'WebKit Linux layout_ng Dummy Builder',
       'WebKit Linux root_layer_scrolls Dummy Builder',
       'WebKit Linux slimming_paint_v2 Dummy Builder',
-      #chromium
-      'Android',
-      'Linux x64',
-      'Mac',
-      'Win',
-      'Win x64',
     ]
 
   def check_input_file_consistency(self):
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 9ef7054..9ee6346 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -255,8 +255,6 @@
   },
   'checkbins': {
     'remove_from': [
-      'Linux x64',
-      'Mac',
       'linux-rel',
       'mac-rel',
     ],
@@ -1079,8 +1077,6 @@
   },
   'sizes': {
     'remove_from': [
-      'Win',
-      'Win x64',
       'win32-rel',
       'win-rel',
     ],
@@ -1096,16 +1092,6 @@
           'linux-release-64/sizes',
         ],
       },
-      'Mac': {
-        'args': [
-          'mac-release/sizes',
-        ],
-      },
-      'Linux x64': {
-        'args': [
-          'linux-release-64/sizes',
-        ],
-      },
       # chromium.android.fyi
       'Android Cronet KitKat Builder': {
         'args': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 5882eeb..1e6586e 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -49,38 +49,6 @@
           'all',
         ],
       },
-      'Linux x64': {
-        'additional_compile_targets': [
-          'all',
-        ],
-        'test_suites': {
-          'scripts': 'public_build_scripts',
-        },
-      },
-      'Mac': {
-        'additional_compile_targets': [
-          'all',
-        ],
-        'test_suites': {
-          'scripts': 'public_build_scripts',
-        },
-      },
-      'Win': {
-        'additional_compile_targets': [
-          'all',
-        ],
-        'test_suites': {
-          'scripts': 'public_build_scripts',
-        },
-      },
-      'Win x64': {
-        'additional_compile_targets': [
-          'all',
-        ],
-        'test_suites': {
-          'scripts': 'public_build_scripts',
-        },
-      },
     }
   },
   {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 856dc51..428563c 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3780,6 +3780,25 @@
             ]
         }
     ],
+    "ServiceWorkerServicification": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ServiceWorkerServicification"
+                    ]
+                }
+            ]
+        }
+    ],
     "SettingsEnforcement": [
         {
             "platforms": [
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests
index 8833deb..5d3847b 100644
--- a/third_party/WebKit/LayoutTests/SlowTests
+++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -421,3 +421,8 @@
 crbug.com/866850 [ Linux Mac ] virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Slow ]
 crbug.com/866850 [ Linux Mac ] virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Slow ]
 crbug.com/866850 [ Linux Mac ] virtual/gpu/fast/canvas/OffscreenCanvas-filter-in-worker.html [ Slow ]
+
+crbug.com/869662 [ Mac10.13 ] virtual/outofblink-cors-ns/http/tests/xmlhttprequest/timeout/xmlhttprequest-timeout-worker-simple.html [ Slow ]
+crbug.com/869662 [ Mac10.13 ] virtual/outofblink-cors-ns/http/tests/xmlhttprequest/timeout/xmlhttprequest-timeout-worker-synconworker.html [ Slow ]
+crbug.com/869662 [ Mac10.13 ] virtual/outofblink-cors/http/tests/xmlhttprequest/timeout/xmlhttprequest-timeout-worker-aborted.html [ Slow ]
+crbug.com/869662 [ Mac10.13 ] virtual/threaded/fast/scrolling/overflow-scrollability.html [ Slow ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 2f2ed65..ed6451e 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2128,7 +2128,7 @@
 crbug.com/658305 css3/filters/effect-reference-external.html [ Failure Pass ]
 crbug.com/658305 css3/filters/effect-reference-external-stylesheet.html [ Failure Pass ]
 crbug.com/658305 css3/filters/effect-reference-hidpi.html [ Failure Pass ]
-crbug.com/658305 css3/filters/effect-reference-hidpi-hw.html [ Failure Pass ]
+crbug.com/658305 css3/filters/effect-reference-hidpi-hw.html [ Failure Pass Timeout ]
 crbug.com/658305 css3/filters/effect-reference.html [ Failure Pass ]
 crbug.com/658305 crbug.com/758133 css3/filters/effect-reference-hw.html [ Failure Pass Timeout ]
 crbug.com/658305 css3/filters/effect-reference-ordering.html [ Failure Pass ]
@@ -4093,7 +4093,8 @@
 crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-gradient-over-color.html [ Skip ]
 crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-gradient-over-gradient.html [ Skip ]
 crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-gradient-over-image.html [ Skip ]
-crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-gradient-over-pattern.html [ Skip ]
+# This is timing out on non-windows platforms, marked as skip on all platforms.
+crbug.com/757165 virtual/gpu/fast/canvas/canvas-blending-gradient-over-pattern.html [ Skip ]
 crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-image-over-color.html [ Skip ]
 crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-image-over-gradient.html [ Skip ]
 crbug.com/757165 [ Win ] virtual/gpu/fast/canvas/canvas-blending-image-over-image.html [ Skip ]
@@ -4865,4 +4866,8 @@
 crbug.com/868706 external/wpt/css/css-layout-api/auto-block-size-inflow.https.html [ Pass Failure ]
 
 # Sheriff 2018-07-31
-crbug.com/869470 external/wpt/background-fetch/get.https.window.html [ Crash Failure ]
\ No newline at end of file
+crbug.com/869470 external/wpt/background-fetch/get.https.window.html [ Pass Failure ]
+crbug.com/869364 css3/filters/filter-repaint-composited-fallback.html [ Pass Timeout ]
+crbug.com/869364 external/wpt/IndexedDB/parallel-cursors-upgrade.html [ Pass Timeout ]
+crbug.com/869364 http/tests/devtools/console/console-correct-suggestions.js [ Pass Timeout ]
+crbug.com/869364 virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index d9351e2..d3ec2de2 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -157894,6 +157894,11 @@
      {}
     ]
    ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/document.open-03-expected.txt": [
     [
      {}
@@ -157904,6 +157909,11 @@
      {}
     ]
    ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/aborted-parser-async-frame.html": [
     [
      {}
@@ -157914,6 +157924,16 @@
      {}
     ]
    ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/bailout-order-synchronous-script-frame.html": [
+    [
+     {}
+    ]
+   ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/document-open-side-effects.js": [
+    [
+     {}
+    ]
+   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/encoding-frame.html": [
     [
      {}
@@ -157984,6 +158004,21 @@
      {}
     ]
    ],
+   "html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "html/webappapis/scripting/events/event-handler-attributes-window-body-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/webappapis/scripting/events/event-handler-processing-algorithm-error/resources/no-op-worker.js": [
     [
      {}
@@ -158019,6 +158054,11 @@
      {}
     ]
    ],
+   "html/webappapis/scripting/events/resources/event-handler-body.js": [
+    [
+     {}
+    ]
+   ],
    "html/webappapis/scripting/events/resources/open-window.html": [
     [
      {}
@@ -224993,6 +225033,30 @@
      {}
     ]
    ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js": [
+    [
+     "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.html",
+     {}
+    ]
+   ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js": [
+    [
+     "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.html",
+     {}
+    ]
+   ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js": [
+    [
+     "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.html",
+     {}
+    ]
+   ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.js": [
+    [
+     "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.html",
+     {}
+    ]
+   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js": [
     [
      "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.html",
@@ -225029,6 +225093,12 @@
      {}
     ]
    ],
+   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js": [
+    [
+     "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.html",
+     {}
+    ]
+   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js": [
     [
      "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.html",
@@ -225077,12 +225147,6 @@
      {}
     ]
    ],
-   "html/webappapis/scripting/events/body-exposed-window-event-handlers.html": [
-    [
-     "/html/webappapis/scripting/events/body-exposed-window-event-handlers.html",
-     {}
-    ]
-   ],
    "html/webappapis/scripting/events/body-onload.html": [
     [
      "/html/webappapis/scripting/events/body-onload.html",
@@ -225113,6 +225177,12 @@
      {}
     ]
    ],
+   "html/webappapis/scripting/events/event-handler-attributes-windowless-body.html": [
+    [
+     "/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html",
+     {}
+    ]
+   ],
    "html/webappapis/scripting/events/event-handler-javascript.html": [
     [
      "/html/webappapis/scripting/events/event-handler-javascript.html",
@@ -225203,9 +225273,15 @@
      {}
     ]
    ],
-   "html/webappapis/scripting/events/event-handler-spec-example.html": [
+   "html/webappapis/scripting/events/event-handler-removal.window.js": [
     [
-     "/html/webappapis/scripting/events/event-handler-spec-example.html",
+     "/html/webappapis/scripting/events/event-handler-removal.window.html",
+     {}
+    ]
+   ],
+   "html/webappapis/scripting/events/event-handler-spec-example.window.js": [
+    [
+     "/html/webappapis/scripting/events/event-handler-spec-example.window.html",
      {}
     ]
    ],
@@ -225221,15 +225297,21 @@
      {}
     ]
    ],
-   "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html": [
+   "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js": [
     [
-     "/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html",
+     "/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.html",
      {}
     ]
    ],
-   "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html": [
+   "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js": [
     [
-     "/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html",
+     "/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.html",
+     {}
+    ]
+   ],
+   "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js": [
+    [
+     "/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.html",
      {}
     ]
    ],
@@ -377320,6 +377402,26 @@
    "0ef6dab1d5e2364a0a75513469e339c20b14c674",
    "testharness"
   ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window-expected.txt": [
+   "7ccc29ab6f1ab5b765976c38965d028f79e5ff5c",
+   "support"
+  ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js": [
+   "6cd609805d6eb7c8dc701ac7286d9fd1c920f484",
+   "testharness"
+  ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js": [
+   "b191a5eb0a6b7ad514d9dbca7f8ced65d80b29bc",
+   "testharness"
+  ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js": [
+   "b725a11dad2765f1674369b3852be2eea3b92adc",
+   "testharness"
+  ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.js": [
+   "0fddab8da9b576fabc0d2f6f9f67996ac0305651",
+   "testharness"
+  ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js": [
    "f6c02de00d0d8edb20f1503304561c8deb36da79",
    "testharness"
@@ -377352,6 +377454,14 @@
    "ccf357a8081b99de1d85e05196145e83b3de2ab5",
    "testharness"
   ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window-expected.txt": [
+   "e4a7e5494ae5617212375d88e960a857a75797b8",
+   "support"
+  ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js": [
+   "ec477e24eaca19f35b250ef49ceaa94c05238b69",
+   "testharness"
+  ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js": [
    "1e1c656e1d19c9c459faf16327e099a4c9e13872",
    "testharness"
@@ -377372,6 +377482,14 @@
    "4cb26a783d232652a580e511e439b8bfaac04dfe",
    "support"
   ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/bailout-order-synchronous-script-frame.html": [
+   "d3bb181459a2e8105fd228c00a376bef82918af6",
+   "support"
+  ],
+  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/document-open-side-effects.js": [
+   "85011156282e56c67b3b94cee3c2c7bc5a8e1e59",
+   "support"
+  ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/encoding-frame.html": [
    "1d8ae9f75fe05343c1858caad637c9f7602c9f28",
    "support"
@@ -377436,10 +377554,6 @@
    "e3e7f3973cf8f9b466d4f22d1ec3b9b9241fb906",
    "support"
   ],
-  "html/webappapis/scripting/events/body-exposed-window-event-handlers.html": [
-   "11dc83c2b4c817e1eed694ed199d327e15abcfa6",
-   "testharness"
-  ],
   "html/webappapis/scripting/events/body-onload.html": [
    "c8e48064f18b1d1eb13e151b69ee60b8d68f4dab",
    "testharness"
@@ -377468,12 +377582,28 @@
    "51076fe86edb21299d64d6a08616e677af98f4ff",
    "testharness"
   ],
+  "html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt": [
+   "d1ea48a4794c2e1fa265bcfe1813033a3bee7652",
+   "support"
+  ],
   "html/webappapis/scripting/events/event-handler-attributes-body-window.html": [
-   "c25750e626c5c2121833fd4627f656ffe9c83d38",
+   "fd27d4bdcdfa1a120977251ee45fd96ede5cf395",
    "testharness"
   ],
+  "html/webappapis/scripting/events/event-handler-attributes-window-body-expected.txt": [
+   "60aafaf62e0201b000a99911b2f3096a4f1eaa35",
+   "support"
+  ],
   "html/webappapis/scripting/events/event-handler-attributes-window-body.html": [
-   "d5a47edd139eb2ff2fe035451f44996bfe2f414d",
+   "ff1dae3a94fc4aa679a80d58333c27035ca2f4f0",
+   "testharness"
+  ],
+  "html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt": [
+   "ae57eae4a4b421693cd6ef699bb81aa5ba90b2f0",
+   "support"
+  ],
+  "html/webappapis/scripting/events/event-handler-attributes-windowless-body.html": [
+   "68bdf4b1a2b95db690c84ec7e33aa86e9465d44e",
    "testharness"
   ],
   "html/webappapis/scripting/events/event-handler-javascript.html": [
@@ -377552,8 +377682,12 @@
    "9a1fa2065ba742d6ab945065d65bdc0f60783d94",
    "testharness"
   ],
-  "html/webappapis/scripting/events/event-handler-spec-example.html": [
-   "a0ab0a1eb5a6aa3cffcb06e2f8ea97ddfcaa6c52",
+  "html/webappapis/scripting/events/event-handler-removal.window.js": [
+   "192a27dd4c7b056767541fbbaec0e96e3f3e8969",
+   "testharness"
+  ],
+  "html/webappapis/scripting/events/event-handler-spec-example.window.js": [
+   "7dcdc2c1a2cf26452f97ee66d98acae506ecdd14",
    "testharness"
   ],
   "html/webappapis/scripting/events/eventhandler-cancellation.html": [
@@ -377564,12 +377698,16 @@
    "873c69a87a5257a0e5278532b162338e9de2a596",
    "testharness"
   ],
-  "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html": [
-   "f26d145d438561fb737956d50c37d165808d3ebf",
+  "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js": [
+   "e5ed84c18ef83ef2b92772afc3434022d8b0ac7d",
    "testharness"
   ],
-  "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html": [
-   "6f2c0cc97bdd385322e0a422e7ea5aa77c280536",
+  "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js": [
+   "b64d3dde3506bfef90daa38fd030f6650b252fe3",
+   "testharness"
+  ],
+  "html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js": [
+   "ba5e4c9dd93b7936e29a8d07a70eceff8370a66e",
    "testharness"
   ],
   "html/webappapis/scripting/events/messageevent-constructor.https-expected.txt": [
@@ -377596,6 +377734,10 @@
    "bec82bc1771743c4262af46e36eaf68a3e2cf9be",
    "support"
   ],
+  "html/webappapis/scripting/events/resources/event-handler-body.js": [
+   "364844d32d6b125b0b86dbe66f271a6e1fa14d35",
+   "support"
+  ],
   "html/webappapis/scripting/events/resources/open-window.html": [
    "f8ea32a9c2fe17f1ed0459f222e5f3151c286caa",
    "support"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window-expected.txt
new file mode 100644
index 0000000..0195cc99
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL document.open bailout should not have any side effects (ignore-opens-during-unload is greater than 0 during unload event) assert_not_equals: document nodes should not be cleared (ignore-opens-during-unload counter is greater than 0 during unload event) got disallowed value 0
+FAIL document.open bailout should not have any side effects (ignore-opens-during-unload is greater than 0 during beforeunload event) assert_not_equals: document nodes should not be cleared (ignore-opens-during-unload counter is greater than 0 during beforeunload event) got disallowed value 0
+FAIL document.open bailout should not have any side effects (ignore-opens-during-unload is greater than 0 during pagehide event) assert_not_equals: document nodes should not be cleared (ignore-opens-during-unload counter is greater than 0 during pagehide event) got disallowed value 0
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js
new file mode 100644
index 0000000..92bd74e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js
@@ -0,0 +1,18 @@
+// META: script=resources/document-open-side-effects.js
+
+for (const ev of ["unload", "beforeunload", "pagehide"]) {
+  async_test(t => {
+    const iframe = document.body.appendChild(document.createElement("iframe"));
+    t.add_cleanup(() => iframe.remove());
+    iframe.src = "/common/blank.html";
+    iframe.onload = t.step_func(() => {
+      iframe.contentWindow.addEventListener(ev, t.step_func_done(() => {
+        const origURL = iframe.contentDocument.URL;
+        assertDocumentIsReadyForSideEffectsTest(iframe.contentDocument, `ignore-opens-during-unload counter is greater than 0 during ${ev} event`);
+        iframe.contentDocument.open();
+        assertOpenHasNoSideEffects(iframe.contentDocument, origURL, `ignore-opens-during-unload counter is greater than 0 during ${ev} event`);
+      }));
+      iframe.src = "about:blank";
+    });
+  }, `document.open bailout should not have any side effects (ignore-opens-during-unload is greater than 0 during ${ev} event)`);
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js
new file mode 100644
index 0000000..ef35452
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js
@@ -0,0 +1,14 @@
+// META: script=/html/resources/common.js
+// META: script=resources/document-open-side-effects.js
+
+document.domain = "{{host}}";
+
+testInIFrame("http://{{host}}:{{ports[http][1]}}/common/domain-setter.sub.html", (ctx) => {
+  const iframe = ctx.iframes[0];
+  const origURL = iframe.contentDocument.URL;
+  assertDocumentIsReadyForSideEffectsTest(iframe.contentDocument, "same origin-domain (but not same origin) document");
+  assert_throws("SecurityError", () => {
+    ctx.iframes[0].contentDocument.open();
+  }, "document.open() should throw a SecurityError on a same origin-domain (but not same origin) document");
+  assertOpenHasNoSideEffects(iframe.contentDocument, origURL, "same origin-domain (but not same origin) document");
+}, "document.open bailout should not have any side effects (same origin-domain (but not same origin) document)");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js
new file mode 100644
index 0000000..6e24357
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js
@@ -0,0 +1,13 @@
+// META: script=resources/document-open-side-effects.js
+
+async_test(t => {
+  const iframe = document.body.appendChild(document.createElement("iframe"));
+  t.add_cleanup(() => iframe.remove());
+  self.testSynchronousScript = t.step_func_done(() => {
+    const origURL = iframe.contentDocument.URL;
+    assertDocumentIsReadyForSideEffectsTest(iframe.contentDocument, "active parser whose script nesting level is greater than 0");
+    iframe.contentDocument.open();
+    assertOpenHasNoSideEffects(iframe.contentDocument, origURL, "active parser whose script nesting level is greater than 0");
+  });
+  iframe.src = "resources/bailout-order-synchronous-script-frame.html";
+}, "document.open bailout should not have any side effects (active parser whose script nesting level is greater than 0)");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.js
new file mode 100644
index 0000000..b3ea1fd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.js
@@ -0,0 +1,15 @@
+// META: script=resources/document-open-side-effects.js
+
+async_test(t => {
+  const iframe = document.body.appendChild(document.createElement("iframe"));
+  t.add_cleanup(() => iframe.remove());
+  iframe.src = "/common/dummy.xhtml";
+  iframe.onload = t.step_func_done(() => {
+    const origURL = iframe.contentDocument.URL;
+    assertDocumentIsReadyForSideEffectsTest(iframe.contentDocument, "XML document");
+    assert_throws("InvalidStateError", () => {
+      iframe.contentDocument.open();
+    }, "document.open() should throw on XML documents");
+    assertOpenHasNoSideEffects(iframe.contentDocument, origURL, "XML document");
+  });
+}, "document.open bailout should not have any side effects (XML document)");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window-expected.txt
new file mode 100644
index 0000000..c3b002d94
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL document.open should bail out when ignore-opens-during-unload is greater than 0 during unload event assert_not_equals: got disallowed value 0
+FAIL document.open should bail out when ignore-opens-during-unload is greater than 0 during beforeunload event assert_not_equals: got disallowed value 0
+FAIL document.open should bail out when ignore-opens-during-unload is greater than 0 during pagehide event assert_not_equals: got disallowed value 0
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js
new file mode 100644
index 0000000..d76ca85
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js
@@ -0,0 +1,15 @@
+for (const ev of ["unload", "beforeunload", "pagehide"]) {
+  async_test(t => {
+    const iframe = document.body.appendChild(document.createElement("iframe"));
+    t.add_cleanup(() => iframe.remove());
+    iframe.src = "/common/blank.html";
+    iframe.onload = t.step_func(() => {
+      iframe.contentWindow.addEventListener(ev, t.step_func_done(() => {
+        assert_not_equals(iframe.contentDocument.childNodes.length, 0);
+        iframe.contentDocument.open();
+        assert_not_equals(iframe.contentDocument.childNodes.length, 0);
+      }));
+      iframe.src = "about:blank";
+    });
+  }, `document.open should bail out when ignore-opens-during-unload is greater than 0 during ${ev} event`);
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/bailout-order-synchronous-script-frame.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/bailout-order-synchronous-script-frame.html
new file mode 100644
index 0000000..632b293
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/bailout-order-synchronous-script-frame.html
@@ -0,0 +1,4 @@
+<p>Text</p>
+<script>
+parent.testSynchronousScript();
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/document-open-side-effects.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/document-open-side-effects.js
new file mode 100644
index 0000000..7cb86dcb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/document-open-side-effects.js
@@ -0,0 +1,8 @@
+function assertDocumentIsReadyForSideEffectsTest(doc, description) {
+  assert_not_equals(doc.childNodes.length, 0, `document should not be empty before side effects test (${description})`);
+}
+
+function assertOpenHasNoSideEffects(doc, originalURL, description) {
+  assert_not_equals(doc.childNodes.length, 0, `document nodes should not be cleared (${description})`);
+  assert_equals(doc.URL, originalURL, `The original URL should be kept (${description})`);
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/body-exposed-window-event-handlers.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/body-exposed-window-event-handlers.html
deleted file mode 100644
index e4f00b86..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/body-exposed-window-event-handlers.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<title></title>
-<body></body>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-var elements = ['body', 'frameset'];
-var handlers = [
-    'load', 'resize', 'blur', 'focus', 'scroll',
-    'afterprint', 'beforeprint', 'beforeunload', 'hashchange',
-    'languagechange', 'message', 'offline', 'online', 'pagehide',
-    'pageshow', 'popstate', 'rejectionhandled', 'storage',
-    'unhandledrejection', 'unload'];
-
-elements.forEach(function (elementName) {
-  handlers.forEach(function (eventName) {
-    var handlerName = "on" + eventName;
-
-    test(function() {
-      var windowHandler = function () { return "Handler attached to the window"; };
-      window[handlerName] = windowHandler;
-
-      var d = (new DOMParser).parseFromString('', 'text/html');
-      var b = d.createElement(elementName);
-
-      assert_equals(b[handlerName], null);
-
-      window[handlerName] = null;
-    }, "Return null when getting the " + eventName + " event handler of a windowless " + elementName);
-
-    test(function() {
-      var windowHandler = function () { return "Handler attached to the window"; };
-      window[handlerName] = windowHandler;
-
-      var d = (new DOMParser).parseFromString('', 'text/html');
-      var b = d.createElement(elementName);
-      b[handlerName] = function() { return "Handler attached to windowless element"; };
-
-      assert_equals(window[handlerName], windowHandler);
-      assert_equals(b[handlerName], null);
-
-      // Clean up window event handler
-      window[handlerName] = null;
-    }, "Ignore setting of " + eventName + " window event handlers on windowless " + elementName);
-  });
-});
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt
new file mode 100644
index 0000000..b85c168
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt
@@ -0,0 +1,210 @@
+This is a testharness.js-based test.
+Found 206 tests; 194 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS shadowed blur (document.body)
+PASS shadowed error (document.body)
+PASS shadowed focus (document.body)
+PASS shadowed load (document.body)
+PASS shadowed resize (document.body)
+PASS shadowed scroll (document.body)
+PASS shadowed afterprint (document.body)
+PASS shadowed beforeprint (document.body)
+PASS shadowed beforeunload (document.body)
+PASS shadowed hashchange (document.body)
+PASS shadowed languagechange (document.body)
+PASS shadowed message (document.body)
+PASS shadowed messageerror (document.body)
+PASS shadowed offline (document.body)
+PASS shadowed online (document.body)
+PASS shadowed pagehide (document.body)
+PASS shadowed pageshow (document.body)
+PASS shadowed popstate (document.body)
+PASS shadowed rejectionhandled (document.body)
+PASS shadowed storage (document.body)
+PASS shadowed unhandledrejection (document.body)
+PASS shadowed unload (document.body)
+PASS not shadowed abort (document.body)
+PASS not shadowed auxclick (document.body)
+PASS not shadowed cancel (document.body)
+PASS not shadowed canplay (document.body)
+PASS not shadowed canplaythrough (document.body)
+PASS not shadowed change (document.body)
+PASS not shadowed click (document.body)
+PASS not shadowed close (document.body)
+PASS not shadowed contextmenu (document.body)
+PASS not shadowed cuechange (document.body)
+PASS not shadowed dblclick (document.body)
+PASS not shadowed drag (document.body)
+PASS not shadowed dragend (document.body)
+PASS not shadowed dragenter (document.body)
+FAIL not shadowed dragexit (document.body) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed dragleave (document.body)
+PASS not shadowed dragover (document.body)
+PASS not shadowed dragstart (document.body)
+PASS not shadowed drop (document.body)
+PASS not shadowed durationchange (document.body)
+PASS not shadowed emptied (document.body)
+PASS not shadowed ended (document.body)
+PASS not shadowed input (document.body)
+PASS not shadowed invalid (document.body)
+PASS not shadowed keydown (document.body)
+PASS not shadowed keypress (document.body)
+PASS not shadowed keyup (document.body)
+PASS not shadowed loadeddata (document.body)
+PASS not shadowed loadedmetadata (document.body)
+FAIL not shadowed loadend (document.body) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed loadstart (document.body)
+PASS not shadowed mousedown (document.body)
+PASS not shadowed mouseenter (document.body)
+PASS not shadowed mouseleave (document.body)
+PASS not shadowed mousemove (document.body)
+PASS not shadowed mouseout (document.body)
+PASS not shadowed mouseover (document.body)
+PASS not shadowed mouseup (document.body)
+PASS not shadowed wheel (document.body)
+PASS not shadowed pause (document.body)
+PASS not shadowed play (document.body)
+PASS not shadowed playing (document.body)
+PASS not shadowed progress (document.body)
+PASS not shadowed ratechange (document.body)
+PASS not shadowed reset (document.body)
+FAIL not shadowed securitypolicyviolation (document.body) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed seeked (document.body)
+PASS not shadowed seeking (document.body)
+PASS not shadowed select (document.body)
+PASS not shadowed stalled (document.body)
+PASS not shadowed submit (document.body)
+PASS not shadowed suspend (document.body)
+PASS not shadowed timeupdate (document.body)
+PASS not shadowed toggle (document.body)
+PASS not shadowed volumechange (document.body)
+PASS not shadowed waiting (document.body)
+FAIL not shadowed copy (document.body) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+FAIL not shadowed cut (document.body) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+FAIL not shadowed paste (document.body) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS shadowed blur removal (document.body)
+PASS shadowed error removal (document.body)
+PASS shadowed focus removal (document.body)
+PASS shadowed load removal (document.body)
+PASS shadowed resize removal (document.body)
+PASS shadowed scroll removal (document.body)
+PASS shadowed afterprint removal (document.body)
+PASS shadowed beforeprint removal (document.body)
+PASS shadowed beforeunload removal (document.body)
+PASS shadowed hashchange removal (document.body)
+PASS shadowed languagechange removal (document.body)
+PASS shadowed message removal (document.body)
+PASS shadowed messageerror removal (document.body)
+PASS shadowed offline removal (document.body)
+PASS shadowed online removal (document.body)
+PASS shadowed pagehide removal (document.body)
+PASS shadowed pageshow removal (document.body)
+PASS shadowed popstate removal (document.body)
+PASS shadowed rejectionhandled removal (document.body)
+PASS shadowed storage removal (document.body)
+PASS shadowed unhandledrejection removal (document.body)
+PASS shadowed unload removal (document.body)
+PASS shadowed blur (document.createElement("body"))
+PASS shadowed error (document.createElement("body"))
+PASS shadowed focus (document.createElement("body"))
+PASS shadowed load (document.createElement("body"))
+PASS shadowed resize (document.createElement("body"))
+PASS shadowed scroll (document.createElement("body"))
+PASS shadowed afterprint (document.createElement("body"))
+PASS shadowed beforeprint (document.createElement("body"))
+PASS shadowed beforeunload (document.createElement("body"))
+PASS shadowed hashchange (document.createElement("body"))
+PASS shadowed languagechange (document.createElement("body"))
+PASS shadowed message (document.createElement("body"))
+PASS shadowed messageerror (document.createElement("body"))
+PASS shadowed offline (document.createElement("body"))
+PASS shadowed online (document.createElement("body"))
+PASS shadowed pagehide (document.createElement("body"))
+PASS shadowed pageshow (document.createElement("body"))
+PASS shadowed popstate (document.createElement("body"))
+PASS shadowed rejectionhandled (document.createElement("body"))
+PASS shadowed storage (document.createElement("body"))
+PASS shadowed unhandledrejection (document.createElement("body"))
+PASS shadowed unload (document.createElement("body"))
+PASS not shadowed abort (document.createElement("body"))
+PASS not shadowed auxclick (document.createElement("body"))
+PASS not shadowed cancel (document.createElement("body"))
+PASS not shadowed canplay (document.createElement("body"))
+PASS not shadowed canplaythrough (document.createElement("body"))
+PASS not shadowed change (document.createElement("body"))
+PASS not shadowed click (document.createElement("body"))
+PASS not shadowed close (document.createElement("body"))
+PASS not shadowed contextmenu (document.createElement("body"))
+PASS not shadowed cuechange (document.createElement("body"))
+PASS not shadowed dblclick (document.createElement("body"))
+PASS not shadowed drag (document.createElement("body"))
+PASS not shadowed dragend (document.createElement("body"))
+PASS not shadowed dragenter (document.createElement("body"))
+FAIL not shadowed dragexit (document.createElement("body")) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed dragleave (document.createElement("body"))
+PASS not shadowed dragover (document.createElement("body"))
+PASS not shadowed dragstart (document.createElement("body"))
+PASS not shadowed drop (document.createElement("body"))
+PASS not shadowed durationchange (document.createElement("body"))
+PASS not shadowed emptied (document.createElement("body"))
+PASS not shadowed ended (document.createElement("body"))
+PASS not shadowed input (document.createElement("body"))
+PASS not shadowed invalid (document.createElement("body"))
+PASS not shadowed keydown (document.createElement("body"))
+PASS not shadowed keypress (document.createElement("body"))
+PASS not shadowed keyup (document.createElement("body"))
+PASS not shadowed loadeddata (document.createElement("body"))
+PASS not shadowed loadedmetadata (document.createElement("body"))
+FAIL not shadowed loadend (document.createElement("body")) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed loadstart (document.createElement("body"))
+PASS not shadowed mousedown (document.createElement("body"))
+PASS not shadowed mouseenter (document.createElement("body"))
+PASS not shadowed mouseleave (document.createElement("body"))
+PASS not shadowed mousemove (document.createElement("body"))
+PASS not shadowed mouseout (document.createElement("body"))
+PASS not shadowed mouseover (document.createElement("body"))
+PASS not shadowed mouseup (document.createElement("body"))
+PASS not shadowed wheel (document.createElement("body"))
+PASS not shadowed pause (document.createElement("body"))
+PASS not shadowed play (document.createElement("body"))
+PASS not shadowed playing (document.createElement("body"))
+PASS not shadowed progress (document.createElement("body"))
+PASS not shadowed ratechange (document.createElement("body"))
+PASS not shadowed reset (document.createElement("body"))
+FAIL not shadowed securitypolicyviolation (document.createElement("body")) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed seeked (document.createElement("body"))
+PASS not shadowed seeking (document.createElement("body"))
+PASS not shadowed select (document.createElement("body"))
+PASS not shadowed stalled (document.createElement("body"))
+PASS not shadowed submit (document.createElement("body"))
+PASS not shadowed suspend (document.createElement("body"))
+PASS not shadowed timeupdate (document.createElement("body"))
+PASS not shadowed toggle (document.createElement("body"))
+PASS not shadowed volumechange (document.createElement("body"))
+PASS not shadowed waiting (document.createElement("body"))
+FAIL not shadowed copy (document.createElement("body")) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+FAIL not shadowed cut (document.createElement("body")) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+FAIL not shadowed paste (document.createElement("body")) assert_equals: window should reflect expected (object) null but got (undefined) undefined
+PASS shadowed blur removal (document.createElement("body"))
+PASS shadowed error removal (document.createElement("body"))
+PASS shadowed focus removal (document.createElement("body"))
+PASS shadowed load removal (document.createElement("body"))
+PASS shadowed resize removal (document.createElement("body"))
+PASS shadowed scroll removal (document.createElement("body"))
+PASS shadowed afterprint removal (document.createElement("body"))
+PASS shadowed beforeprint removal (document.createElement("body"))
+PASS shadowed beforeunload removal (document.createElement("body"))
+PASS shadowed hashchange removal (document.createElement("body"))
+PASS shadowed languagechange removal (document.createElement("body"))
+PASS shadowed message removal (document.createElement("body"))
+PASS shadowed messageerror removal (document.createElement("body"))
+PASS shadowed offline removal (document.createElement("body"))
+PASS shadowed online removal (document.createElement("body"))
+PASS shadowed pagehide removal (document.createElement("body"))
+PASS shadowed pageshow removal (document.createElement("body"))
+PASS shadowed popstate removal (document.createElement("body"))
+PASS shadowed rejectionhandled removal (document.createElement("body"))
+PASS shadowed storage removal (document.createElement("body"))
+PASS shadowed unhandledrejection removal (document.createElement("body"))
+PASS shadowed unload removal (document.createElement("body"))
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html
index 1c87892..4a6bee6 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html
@@ -3,32 +3,49 @@
 
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="resources/event-handler-body.js"></script>
 <div id="log"></div>
 <body>
 <script>
-function f() {
-  return 0;
-}
+setup({ explicit_done: true });
 
-var handlers = ['blur','error','focus','load','resize','scroll',
-                'afterprint','beforeprint','beforeunload','hashchange',
-                'languagechange','message','offline','online','pagehide',
-                'pageshow','popstate','storage','unload'];
-handlers.forEach(function(handler) {
-  test(function() {
-    document.body['on' + handler] = f;
-    assert_equals(window['on' + handler], f);
-  }, handler);
-});
+handlersListPromise.then(({ shadowedHandlers, notShadowedHandlers }) => {
+  const createdBody = document.createElement("body");
+  for (const [description, body, altBody] of [
+    ["document.body", document.body, createdBody],
+    ['document.createElement("body")', createdBody, document.body]
+  ]) {
+    const f = () => 0;
 
-handlers.forEach(function(handler) {
-    document.body['on' + handler] = null;
-});
+    shadowedHandlers.forEach(function(handler) {
+      test(function() {
+        body['on' + handler] = f;
+        assert_equals(window['on' + handler], f, "window should reflect");
+        assert_equals(altBody['on' + handler], f, "alternative body should reflect");
+      }, `shadowed ${handler} (${description})`);
+    });
+    notShadowedHandlers.forEach(function(handler) {
+      test(function() {
+        body['on' + handler] = f;
+        assert_equals(window['on' + handler], null, "window should reflect");
+        assert_equals(altBody['on' + handler], null, "alternative body should reflect");
+      }, `not shadowed ${handler} (${description})`);
+    });
 
-handlers.forEach(function(handler) {
-  test(function() {
-    assert_equals(document.body['on' + handler], null);
-    assert_equals(window['on' + handler], null);
-  }, handler + " removal");
+    [...shadowedHandlers, ...notShadowedHandlers].forEach(function(handler) {
+      body['on' + handler] = null;
+    });
+
+    shadowedHandlers.forEach(function(handler) {
+      test(function() {
+        assert_equals(body['on' + handler], null, "body should reflect changes to itself");
+        assert_equals(window['on' + handler], null, "window should reflect");
+        assert_equals(altBody['on' + handler], null, "alternative body should reflect");
+      }, `shadowed ${handler} removal (${description})`);
+    });
+  }
+
+  done();
 });
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body-expected.txt
new file mode 100644
index 0000000..ac3deb4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body-expected.txt
@@ -0,0 +1,107 @@
+This is a testharness.js-based test.
+Found 103 tests; 100 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS shadowed blur
+PASS shadowed error
+PASS shadowed focus
+PASS shadowed load
+PASS shadowed resize
+PASS shadowed scroll
+PASS shadowed afterprint
+PASS shadowed beforeprint
+PASS shadowed beforeunload
+PASS shadowed hashchange
+PASS shadowed languagechange
+PASS shadowed message
+PASS shadowed messageerror
+PASS shadowed offline
+PASS shadowed online
+PASS shadowed pagehide
+PASS shadowed pageshow
+PASS shadowed popstate
+PASS shadowed rejectionhandled
+PASS shadowed storage
+PASS shadowed unhandledrejection
+PASS shadowed unload
+PASS not shadowed abort
+PASS not shadowed auxclick
+PASS not shadowed cancel
+PASS not shadowed canplay
+PASS not shadowed canplaythrough
+PASS not shadowed change
+PASS not shadowed click
+PASS not shadowed close
+PASS not shadowed contextmenu
+PASS not shadowed cuechange
+PASS not shadowed dblclick
+PASS not shadowed drag
+PASS not shadowed dragend
+PASS not shadowed dragenter
+FAIL not shadowed dragexit assert_equals: document.body should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed dragleave
+PASS not shadowed dragover
+PASS not shadowed dragstart
+PASS not shadowed drop
+PASS not shadowed durationchange
+PASS not shadowed emptied
+PASS not shadowed ended
+PASS not shadowed input
+PASS not shadowed invalid
+PASS not shadowed keydown
+PASS not shadowed keypress
+PASS not shadowed keyup
+PASS not shadowed loadeddata
+PASS not shadowed loadedmetadata
+FAIL not shadowed loadend assert_equals: document.body should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed loadstart
+PASS not shadowed mousedown
+PASS not shadowed mouseenter
+PASS not shadowed mouseleave
+PASS not shadowed mousemove
+PASS not shadowed mouseout
+PASS not shadowed mouseover
+PASS not shadowed mouseup
+PASS not shadowed wheel
+PASS not shadowed pause
+PASS not shadowed play
+PASS not shadowed playing
+PASS not shadowed progress
+PASS not shadowed ratechange
+PASS not shadowed reset
+FAIL not shadowed securitypolicyviolation assert_equals: document.body should reflect expected (object) null but got (undefined) undefined
+PASS not shadowed seeked
+PASS not shadowed seeking
+PASS not shadowed select
+PASS not shadowed stalled
+PASS not shadowed submit
+PASS not shadowed suspend
+PASS not shadowed timeupdate
+PASS not shadowed toggle
+PASS not shadowed volumechange
+PASS not shadowed waiting
+PASS not shadowed copy
+PASS not shadowed cut
+PASS not shadowed paste
+PASS shadowed blur removal
+PASS shadowed error removal
+PASS shadowed focus removal
+PASS shadowed load removal
+PASS shadowed resize removal
+PASS shadowed scroll removal
+PASS shadowed afterprint removal
+PASS shadowed beforeprint removal
+PASS shadowed beforeunload removal
+PASS shadowed hashchange removal
+PASS shadowed languagechange removal
+PASS shadowed message removal
+PASS shadowed messageerror removal
+PASS shadowed offline removal
+PASS shadowed online removal
+PASS shadowed pagehide removal
+PASS shadowed pageshow removal
+PASS shadowed popstate removal
+PASS shadowed rejectionhandled removal
+PASS shadowed storage removal
+PASS shadowed unhandledrejection removal
+PASS shadowed unload removal
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body.html
index 29c4c133..1ceed52 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-window-body.html
@@ -3,32 +3,47 @@
 
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="resources/event-handler-body.js"></script>
 <div id="log"></div>
 <body>
 <script>
+setup({ explicit_done: true });
+
 function f() {
   return 0;
 }
 
-var handlers = ['blur','error','focus','load','resize','scroll',
-                'afterprint','beforeprint','beforeunload','hashchange',
-                'languagechange','message','offline','online','pagehide',
-                'pageshow','popstate','storage','unload'];
-handlers.forEach(function(handler) {
-  test(function() {
-    window['on' + handler] = f;
-    assert_equals(document.body['on' + handler], f);
-  }, handler);
-});
+handlersListPromise.then(({ shadowedHandlers, notShadowedHandlers }) => {
+  const body = document.createElement("body");
 
-handlers.forEach(function(handler) {
+  shadowedHandlers.forEach(function(handler) {
+    test(function() {
+      window['on' + handler] = f;
+      assert_equals(document.body['on' + handler], f, "document.body should reflect");
+      assert_equals(body['on' + handler], f, "document.createElement('body') should reflect");
+    }, `shadowed ${handler}`);
+  });
+  notShadowedHandlers.forEach(function(handler) {
+    test(function() {
+      window['on' + handler] = f;
+      assert_equals(document.body['on' + handler], null, "document.body should reflect");
+      assert_equals(body['on' + handler], null, "document.createElement('body') should reflect");
+    }, `not shadowed ${handler}`);
+  });
+
+  [...shadowedHandlers, ...notShadowedHandlers].forEach(function(handler) {
     window['on' + handler] = null;
-});
+  });
 
-handlers.forEach(function(handler) {
-  test(function() {
-    assert_equals(window['on' + handler], null);
-    assert_equals(document.body['on' + handler], null);
-  }, handler + " removal");
+  shadowedHandlers.forEach(function(handler) {
+    test(function() {
+      assert_equals(window['on' + handler], null, "window should reflect changes to itself");
+      assert_equals(document.body['on' + handler], null, "document.body should reflect");
+      assert_equals(body['on' + handler], null, "document.createElement('body') should reflect");
+    }, `shadowed ${handler} removal`);
+  });
+
+  done();
 });
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt
new file mode 100644
index 0000000..8a2ab90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt
@@ -0,0 +1,210 @@
+This is a testharness.js-based test.
+Found 206 tests; 200 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Return null when getting the blur event handler of a windowless body
+PASS Ignore setting of blur window event handlers on windowless body
+PASS Return null when getting the error event handler of a windowless body
+PASS Ignore setting of error window event handlers on windowless body
+PASS Return null when getting the focus event handler of a windowless body
+PASS Ignore setting of focus window event handlers on windowless body
+PASS Return null when getting the load event handler of a windowless body
+PASS Ignore setting of load window event handlers on windowless body
+PASS Return null when getting the resize event handler of a windowless body
+PASS Ignore setting of resize window event handlers on windowless body
+PASS Return null when getting the scroll event handler of a windowless body
+PASS Ignore setting of scroll window event handlers on windowless body
+PASS Return null when getting the afterprint event handler of a windowless body
+PASS Ignore setting of afterprint window event handlers on windowless body
+PASS Return null when getting the beforeprint event handler of a windowless body
+PASS Ignore setting of beforeprint window event handlers on windowless body
+PASS Return null when getting the beforeunload event handler of a windowless body
+PASS Ignore setting of beforeunload window event handlers on windowless body
+PASS Return null when getting the hashchange event handler of a windowless body
+PASS Ignore setting of hashchange window event handlers on windowless body
+PASS Return null when getting the languagechange event handler of a windowless body
+PASS Ignore setting of languagechange window event handlers on windowless body
+PASS Return null when getting the message event handler of a windowless body
+PASS Ignore setting of message window event handlers on windowless body
+PASS Return null when getting the messageerror event handler of a windowless body
+PASS Ignore setting of messageerror window event handlers on windowless body
+PASS Return null when getting the offline event handler of a windowless body
+PASS Ignore setting of offline window event handlers on windowless body
+PASS Return null when getting the online event handler of a windowless body
+PASS Ignore setting of online window event handlers on windowless body
+PASS Return null when getting the pagehide event handler of a windowless body
+PASS Ignore setting of pagehide window event handlers on windowless body
+PASS Return null when getting the pageshow event handler of a windowless body
+PASS Ignore setting of pageshow window event handlers on windowless body
+PASS Return null when getting the popstate event handler of a windowless body
+PASS Ignore setting of popstate window event handlers on windowless body
+PASS Return null when getting the rejectionhandled event handler of a windowless body
+PASS Ignore setting of rejectionhandled window event handlers on windowless body
+PASS Return null when getting the storage event handler of a windowless body
+PASS Ignore setting of storage window event handlers on windowless body
+PASS Return null when getting the unhandledrejection event handler of a windowless body
+PASS Ignore setting of unhandledrejection window event handlers on windowless body
+PASS Return null when getting the unload event handler of a windowless body
+PASS Ignore setting of unload window event handlers on windowless body
+PASS abort is unaffected on a windowless body
+PASS auxclick is unaffected on a windowless body
+PASS cancel is unaffected on a windowless body
+PASS canplay is unaffected on a windowless body
+PASS canplaythrough is unaffected on a windowless body
+PASS change is unaffected on a windowless body
+PASS click is unaffected on a windowless body
+PASS close is unaffected on a windowless body
+PASS contextmenu is unaffected on a windowless body
+PASS cuechange is unaffected on a windowless body
+PASS dblclick is unaffected on a windowless body
+PASS drag is unaffected on a windowless body
+PASS dragend is unaffected on a windowless body
+PASS dragenter is unaffected on a windowless body
+FAIL dragexit is unaffected on a windowless body assert_equals: expected (object) null but got (undefined) undefined
+PASS dragleave is unaffected on a windowless body
+PASS dragover is unaffected on a windowless body
+PASS dragstart is unaffected on a windowless body
+PASS drop is unaffected on a windowless body
+PASS durationchange is unaffected on a windowless body
+PASS emptied is unaffected on a windowless body
+PASS ended is unaffected on a windowless body
+PASS input is unaffected on a windowless body
+PASS invalid is unaffected on a windowless body
+PASS keydown is unaffected on a windowless body
+PASS keypress is unaffected on a windowless body
+PASS keyup is unaffected on a windowless body
+PASS loadeddata is unaffected on a windowless body
+PASS loadedmetadata is unaffected on a windowless body
+FAIL loadend is unaffected on a windowless body assert_equals: expected (object) null but got (undefined) undefined
+PASS loadstart is unaffected on a windowless body
+PASS mousedown is unaffected on a windowless body
+PASS mouseenter is unaffected on a windowless body
+PASS mouseleave is unaffected on a windowless body
+PASS mousemove is unaffected on a windowless body
+PASS mouseout is unaffected on a windowless body
+PASS mouseover is unaffected on a windowless body
+PASS mouseup is unaffected on a windowless body
+PASS wheel is unaffected on a windowless body
+PASS pause is unaffected on a windowless body
+PASS play is unaffected on a windowless body
+PASS playing is unaffected on a windowless body
+PASS progress is unaffected on a windowless body
+PASS ratechange is unaffected on a windowless body
+PASS reset is unaffected on a windowless body
+FAIL securitypolicyviolation is unaffected on a windowless body assert_equals: expected (object) null but got (undefined) undefined
+PASS seeked is unaffected on a windowless body
+PASS seeking is unaffected on a windowless body
+PASS select is unaffected on a windowless body
+PASS stalled is unaffected on a windowless body
+PASS submit is unaffected on a windowless body
+PASS suspend is unaffected on a windowless body
+PASS timeupdate is unaffected on a windowless body
+PASS toggle is unaffected on a windowless body
+PASS volumechange is unaffected on a windowless body
+PASS waiting is unaffected on a windowless body
+PASS copy is unaffected on a windowless body
+PASS cut is unaffected on a windowless body
+PASS paste is unaffected on a windowless body
+PASS Return null when getting the blur event handler of a windowless frameset
+PASS Ignore setting of blur window event handlers on windowless frameset
+PASS Return null when getting the error event handler of a windowless frameset
+PASS Ignore setting of error window event handlers on windowless frameset
+PASS Return null when getting the focus event handler of a windowless frameset
+PASS Ignore setting of focus window event handlers on windowless frameset
+PASS Return null when getting the load event handler of a windowless frameset
+PASS Ignore setting of load window event handlers on windowless frameset
+PASS Return null when getting the resize event handler of a windowless frameset
+PASS Ignore setting of resize window event handlers on windowless frameset
+PASS Return null when getting the scroll event handler of a windowless frameset
+PASS Ignore setting of scroll window event handlers on windowless frameset
+PASS Return null when getting the afterprint event handler of a windowless frameset
+PASS Ignore setting of afterprint window event handlers on windowless frameset
+PASS Return null when getting the beforeprint event handler of a windowless frameset
+PASS Ignore setting of beforeprint window event handlers on windowless frameset
+PASS Return null when getting the beforeunload event handler of a windowless frameset
+PASS Ignore setting of beforeunload window event handlers on windowless frameset
+PASS Return null when getting the hashchange event handler of a windowless frameset
+PASS Ignore setting of hashchange window event handlers on windowless frameset
+PASS Return null when getting the languagechange event handler of a windowless frameset
+PASS Ignore setting of languagechange window event handlers on windowless frameset
+PASS Return null when getting the message event handler of a windowless frameset
+PASS Ignore setting of message window event handlers on windowless frameset
+PASS Return null when getting the messageerror event handler of a windowless frameset
+PASS Ignore setting of messageerror window event handlers on windowless frameset
+PASS Return null when getting the offline event handler of a windowless frameset
+PASS Ignore setting of offline window event handlers on windowless frameset
+PASS Return null when getting the online event handler of a windowless frameset
+PASS Ignore setting of online window event handlers on windowless frameset
+PASS Return null when getting the pagehide event handler of a windowless frameset
+PASS Ignore setting of pagehide window event handlers on windowless frameset
+PASS Return null when getting the pageshow event handler of a windowless frameset
+PASS Ignore setting of pageshow window event handlers on windowless frameset
+PASS Return null when getting the popstate event handler of a windowless frameset
+PASS Ignore setting of popstate window event handlers on windowless frameset
+PASS Return null when getting the rejectionhandled event handler of a windowless frameset
+PASS Ignore setting of rejectionhandled window event handlers on windowless frameset
+PASS Return null when getting the storage event handler of a windowless frameset
+PASS Ignore setting of storage window event handlers on windowless frameset
+PASS Return null when getting the unhandledrejection event handler of a windowless frameset
+PASS Ignore setting of unhandledrejection window event handlers on windowless frameset
+PASS Return null when getting the unload event handler of a windowless frameset
+PASS Ignore setting of unload window event handlers on windowless frameset
+PASS abort is unaffected on a windowless frameset
+PASS auxclick is unaffected on a windowless frameset
+PASS cancel is unaffected on a windowless frameset
+PASS canplay is unaffected on a windowless frameset
+PASS canplaythrough is unaffected on a windowless frameset
+PASS change is unaffected on a windowless frameset
+PASS click is unaffected on a windowless frameset
+PASS close is unaffected on a windowless frameset
+PASS contextmenu is unaffected on a windowless frameset
+PASS cuechange is unaffected on a windowless frameset
+PASS dblclick is unaffected on a windowless frameset
+PASS drag is unaffected on a windowless frameset
+PASS dragend is unaffected on a windowless frameset
+PASS dragenter is unaffected on a windowless frameset
+FAIL dragexit is unaffected on a windowless frameset assert_equals: expected (object) null but got (undefined) undefined
+PASS dragleave is unaffected on a windowless frameset
+PASS dragover is unaffected on a windowless frameset
+PASS dragstart is unaffected on a windowless frameset
+PASS drop is unaffected on a windowless frameset
+PASS durationchange is unaffected on a windowless frameset
+PASS emptied is unaffected on a windowless frameset
+PASS ended is unaffected on a windowless frameset
+PASS input is unaffected on a windowless frameset
+PASS invalid is unaffected on a windowless frameset
+PASS keydown is unaffected on a windowless frameset
+PASS keypress is unaffected on a windowless frameset
+PASS keyup is unaffected on a windowless frameset
+PASS loadeddata is unaffected on a windowless frameset
+PASS loadedmetadata is unaffected on a windowless frameset
+FAIL loadend is unaffected on a windowless frameset assert_equals: expected (object) null but got (undefined) undefined
+PASS loadstart is unaffected on a windowless frameset
+PASS mousedown is unaffected on a windowless frameset
+PASS mouseenter is unaffected on a windowless frameset
+PASS mouseleave is unaffected on a windowless frameset
+PASS mousemove is unaffected on a windowless frameset
+PASS mouseout is unaffected on a windowless frameset
+PASS mouseover is unaffected on a windowless frameset
+PASS mouseup is unaffected on a windowless frameset
+PASS wheel is unaffected on a windowless frameset
+PASS pause is unaffected on a windowless frameset
+PASS play is unaffected on a windowless frameset
+PASS playing is unaffected on a windowless frameset
+PASS progress is unaffected on a windowless frameset
+PASS ratechange is unaffected on a windowless frameset
+PASS reset is unaffected on a windowless frameset
+FAIL securitypolicyviolation is unaffected on a windowless frameset assert_equals: expected (object) null but got (undefined) undefined
+PASS seeked is unaffected on a windowless frameset
+PASS seeking is unaffected on a windowless frameset
+PASS select is unaffected on a windowless frameset
+PASS stalled is unaffected on a windowless frameset
+PASS submit is unaffected on a windowless frameset
+PASS suspend is unaffected on a windowless frameset
+PASS timeupdate is unaffected on a windowless frameset
+PASS toggle is unaffected on a windowless frameset
+PASS volumechange is unaffected on a windowless frameset
+PASS waiting is unaffected on a windowless frameset
+PASS copy is unaffected on a windowless frameset
+PASS cut is unaffected on a windowless frameset
+PASS paste is unaffected on a windowless frameset
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html
new file mode 100644
index 0000000..9b81d42
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<meta charset="utf-8">
+<title></title>
+<body></body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="resources/event-handler-body.js"></script>
+<script>
+setup({ explicit_done: true });
+const elements = ['body', 'frameset'];
+handlersListPromise.then(({ shadowedHandlers, notShadowedHandlers }) => {
+  elements.forEach(function (elementName) {
+    shadowedHandlers.forEach(function (eventName) {
+      var handlerName = "on" + eventName;
+
+      test(function() {
+        var windowHandler = function () { return "Handler attached to the window"; };
+        window[handlerName] = windowHandler;
+
+        var d = (new DOMParser).parseFromString('', 'text/html');
+        var b = d.createElement(elementName);
+
+        assert_equals(b[handlerName], null);
+
+        window[handlerName] = null;
+      }, "Return null when getting the " + eventName + " event handler of a windowless " + elementName);
+
+      test(function() {
+        var windowHandler = function () { return "Handler attached to the window"; };
+        window[handlerName] = windowHandler;
+
+        var d = (new DOMParser).parseFromString('', 'text/html');
+        var b = d.createElement(elementName);
+        b[handlerName] = function() { return "Handler attached to windowless element"; };
+
+        assert_equals(window[handlerName], windowHandler);
+        assert_equals(b[handlerName], null);
+
+        // Clean up window event handler
+        window[handlerName] = null;
+      }, "Ignore setting of " + eventName + " window event handlers on windowless " + elementName);
+    });
+
+    notShadowedHandlers.forEach(function (eventName) {
+      var handlerName = "on" + eventName;
+
+      test(function() {
+        var windowHandler = function () { return "Handler attached to the window"; };
+        window[handlerName] = windowHandler;
+
+        var d = (new DOMParser).parseFromString('', 'text/html');
+        var b = d.createElement(elementName);
+
+        assert_equals(b[handlerName], null);
+
+        var elementHandler = function () { return "Handler attached to the element"; };
+        b[handlerName] = elementHandler;
+
+        assert_equals(window[handlerName], windowHandler);
+        assert_equals(b[handlerName], elementHandler);
+
+        // Clean up window event handler
+        window[handlerName] = null;
+      }, eventName + " is unaffected on a windowless " + elementName);
+    });
+  });
+
+  done();
+});
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-removal.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-removal.window.js
new file mode 100644
index 0000000..d0f75c5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-removal.window.js
@@ -0,0 +1,70 @@
+test(() => {
+  var i = 0;
+  var uncalled = "assert_unreached('First event handler.');"
+  var button = document.createElement('button');
+  button.addEventListener('click', () => { assert_equals(++i, 1); }, false);
+  button.setAttribute('onclick', uncalled);                             // event handler is activated here
+  button.addEventListener('click', () => { assert_equals(++i, 2); }, false);
+  button.onclick = null;                                                // but de-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 3); }, false);
+  button.onclick = () => { assert_equals(++i, 4); };                    // and re-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 5); }, false);
+  button.click()
+  assert_equals(button.getAttribute("onclick"), uncalled)
+  assert_equals(i, 5);
+}, "Event handler set through content attribute should be removed when they are set to null.");
+
+let happened = 0;
+test(() => {
+  var script = "happened++;";
+  var button = document.createElement('button');
+  button.setAttribute('onclick', script);                               // event handler is activated here
+  button.onclick = null;                                                // but de-activated here
+  assert_equals(button.getAttribute("onclick"), script)
+  button.setAttribute('onclick', script);                               // and re-activated here
+  button.click()
+  assert_equals(happened, 1);
+}, "Event handler set through content attribute should be re-activated even if content is the same.");
+
+test(() => {
+  var i = 0;
+  var uncalled = "assert_unreached('First event handler.');"
+  var button = document.createElement('button');
+  button.addEventListener('click', () => { assert_equals(++i, 1); }, false);
+  button.setAttribute('onclick', uncalled);                             // event handler is activated here
+  button.addEventListener('click', () => { assert_equals(++i, 2); }, false);
+  button.removeAttribute('onclick');                                    // but de-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 3); }, false);
+  button.onclick = () => { assert_equals(++i, 4); };                    // and re-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 5); }, false);
+  button.click()
+  assert_equals(i, 5);
+}, "Event handler set through content attribute should be deactivated when the content attribute is removed.");
+test(t => {
+  var i = 0;
+  var uncalled = "assert_unreached('First event handler.');"
+  var button = document.createElement('button');
+  button.addEventListener('click', () => { assert_equals(++i, 1); }, false);
+  button.onclick = t.unreached_func('First event handler.');            // event handler is activated here
+  button.addEventListener('click', () => { assert_equals(++i, 2); }, false);
+  button.onclick = null;                                                // but de-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 3); }, false);
+  button.onclick = () => { assert_equals(++i, 4); };                    // and re-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 5); }, false);
+  button.click()
+  assert_equals(i, 5);
+}, "Event handler set through IDL should be deactivated when the IDL attribute is set to null.");
+test(t => {
+  var i = 0;
+  var uncalled = "assert_unreached('First event handler.');"
+  var button = document.createElement('button');
+  button.addEventListener('click', () => { assert_equals(++i, 1) }, false);
+  button.onclick = t.unreached_func('First event handler.');            // event handler is activated here
+  button.addEventListener('click', () => { assert_equals(++i, 3) }, false);
+  button.removeAttribute('onclick');                                    // but de-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 4) }, false);
+  button.onclick = () => { assert_equals(++i, 2); };                    // and re-activated here
+  button.addEventListener('click', () => { assert_equals(++i, 5) }, false);
+  button.click()
+  assert_equals(i, 5);
+}, "Event handler set through IDL should NOT be deactivated when the content attribute is removed.");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-spec-example.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-spec-example.html
deleted file mode 100644
index 1f3cff42..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-spec-example.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html>
-<title>Event handler invocation order</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-var objects = [{}, function() {}, new Number(42), new String()];
-var primitives = [42, null, undefined, ""];
-objects.forEach(function(object) {
-  var t = async_test("Event handler listeners should be registered when they " +
-                     "are first set to an object value (" +
-                     format_value(object) + ").");
-  t.step(function() {
-    var i = 0;
-    var uncalled = "t.step(function() { assert_unreached('First event handler.') })"
-    var button = document.createElement('button');
-    button.onclick = object; // event handler listener is registered here
-    assert_equals(button.onclick, object);
-    button.addEventListener('click', t.step_func(function () { assert_equals(++i, 2) }), false);
-    button.setAttribute('onclick', uncalled);
-    button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false);
-    button.onclick = t.step_func(function () { assert_equals(++i, 1); });
-    button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false);
-    button.click()
-    assert_equals(button.getAttribute("onclick"), uncalled)
-    assert_equals(i, 4);
-    t.done()
-  });
-});
-primitives.forEach(function(primitive) {
-  var t = async_test("Event handler listeners should be registered when they " +
-                     "are first set to an object value (" +
-                     format_value(primitive) + ").");
-  t.step(function() {
-    var i = 0;
-    var uncalled = "t.step(function() { assert_unreached('First event handler.') })"
-    var button = document.createElement('button');
-    button.onclick = primitive;
-    assert_equals(button.onclick, null);
-    button.addEventListener('click', t.step_func(function () { assert_equals(++i, 1) }), false);
-    button.setAttribute('onclick', uncalled); // event handler listener is registered here
-    button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false);
-    button.onclick = t.step_func(function () { assert_equals(++i, 2); });
-    button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false);
-    button.click()
-    assert_equals(button.getAttribute("onclick"), uncalled)
-    assert_equals(i, 4);
-    t.done()
-  });
-});
-var t = async_test("Event handler listeners should be registered when they " +
-                   "are first set to an object value.");
-t.step(function() {
-  var i = 0;
-  var uncalled = "t.step(function() { assert_unreached('First event handler.') })"
-  var button = document.createElement('button');
-  button.addEventListener('click', t.step_func(function () { assert_equals(++i, 1) }), false);
-  button.setAttribute('onclick', uncalled); // event handler listener is registered here
-  button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false);
-  button.onclick = t.step_func(function () { assert_equals(++i, 2); });
-  button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false);
-  button.click()
-  assert_equals(button.getAttribute("onclick"), uncalled)
-  assert_equals(i, 4);
-  t.done()
-});
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-spec-example.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-spec-example.window.js
new file mode 100644
index 0000000..7bfbe58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/event-handler-spec-example.window.js
@@ -0,0 +1,51 @@
+var objects = [{}, function() {}, new Number(42), new String()];
+var primitives = [42, null, undefined, ""];
+objects.forEach(function(object) {
+  test(function() {
+    var i = 0;
+    var uncalled = "assert_unreached('First event handler.');"
+    var button = document.createElement('button');
+    button.onclick = object; // event handler listener is registered here
+    assert_equals(button.onclick, object);
+    button.addEventListener('click', function () { assert_equals(++i, 2) }, false);
+    button.setAttribute('onclick', uncalled);
+    button.addEventListener('click', function () { assert_equals(++i, 3) }, false);
+    button.onclick = function () { assert_equals(++i, 1); };
+    button.addEventListener('click', function () { assert_equals(++i, 4) }, false);
+    button.click()
+    assert_equals(button.getAttribute("onclick"), uncalled)
+    assert_equals(i, 4);
+  }, "Event handler listeners should be registered when they are first set to an object value " +
+     "(" + format_value(object) + ").");
+});
+primitives.forEach(function(primitive) {
+  test(function() {
+    var i = 0;
+    var uncalled = "assert_unreached('First event handler.');"
+    var button = document.createElement('button');
+    button.onclick = primitive;
+    assert_equals(button.onclick, null);
+    button.addEventListener('click', function () { assert_equals(++i, 1) }, false);
+    button.setAttribute('onclick', uncalled); // event handler listener is registered here
+    button.addEventListener('click', function () { assert_equals(++i, 3) }, false);
+    button.onclick = function () { assert_equals(++i, 2); };
+    button.addEventListener('click', function () { assert_equals(++i, 4) }, false);
+    button.click()
+    assert_equals(button.getAttribute("onclick"), uncalled)
+    assert_equals(i, 4);
+  }, "Event handler listeners should be registered when they are first set to an object value " +
+     "(" + format_value(primitive) + ").");
+});
+test(function() {
+  var i = 0;
+  var uncalled = "assert_unreached('First event handler.');"
+  var button = document.createElement('button');
+  button.addEventListener('click', function () { assert_equals(++i, 1) }, false);
+  button.setAttribute('onclick', uncalled); // event handler listener is registered here
+  button.addEventListener('click', function () { assert_equals(++i, 3) }, false);
+  button.onclick = function () { assert_equals(++i, 2); };
+  button.addEventListener('click', function () { assert_equals(++i, 4) }, false);
+  button.click()
+  assert_equals(button.getAttribute("onclick"), uncalled)
+  assert_equals(i, 4);
+}, "Event handler listeners should be registered when they are first set to an object value.");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js
similarity index 64%
rename from third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html
rename to third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js
index 83ee250..2892a4c3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js
@@ -1,10 +1,3 @@
-<!doctype html>
-<meta charset="utf-8">
-<title>Invalid uncompiled raw handlers should only be compiled when about to call them.</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<body>
-<script>
 setup({ allow_uncaught_exception: true });
 
 test(function() {
@@ -20,6 +13,4 @@
   div.dispatchEvent(new Event("click"));
   assert_equals(div.onclick, null);
   assert_array_equals(events, ["click 1", "error", "click 2"]);
-});
-</script>
-</body>
+}, "Invalid uncompiled raw handlers should only be compiled when about to call them");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html
deleted file mode 100644
index a67f66e..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<title>Invalid uncompiled raw handlers should only be compiled once.</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<body>
-<script>
-setup({ allow_uncaught_exception: true });
-
-var errors = 0;
-window.onerror = function() {
-  errors++;
-};
-
-test(function() {
-  var e = document.body;
-  e.setAttribute("onclick", "window.open(");
-  assert_equals(e.onclick, null);
-  assert_equals(e.onclick, null);
-  assert_equals(errors, 1);
-});
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js
new file mode 100644
index 0000000..b39b54b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js
@@ -0,0 +1,14 @@
+setup({ allow_uncaught_exception: true });
+
+var errors = 0;
+window.onerror = function() {
+  errors++;
+};
+
+test(function() {
+  var e = document.body;
+  e.setAttribute("onclick", "window.open(");
+  assert_equals(e.onclick, null);
+  assert_equals(e.onclick, null);
+  assert_equals(errors, 1);
+}, "Invalid uncompiled raw handlers should only be compiled once");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js
new file mode 100644
index 0000000..f9443bf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js
@@ -0,0 +1,20 @@
+setup({ allow_uncaught_exception: true });
+
+test(function() {
+  var events = [];
+  window.onerror = function() {
+    events.push("error");
+  };
+
+  var div = document.createElement("div");
+  div.addEventListener("click", function (e) { events.push("click 1"); });
+  div.setAttribute("onclick", "}");
+  div.addEventListener("click", function (e) { events.push("click 3"); });
+  assert_equals(div.onclick, null);
+  assert_array_equals(events, ["error"]);
+
+  events = [];
+  div.onclick = function (e) { events.push("click 2"); };
+  div.dispatchEvent(new Event("click"));
+  assert_array_equals(events, ["click 1", "click 2", "click 3"]);
+}, "Compiling invalid uncompiled raw handlers should keep the position in event listener list");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/resources/event-handler-body.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/resources/event-handler-body.js
new file mode 100644
index 0000000..656903c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/events/resources/event-handler-body.js
@@ -0,0 +1,26 @@
+const windowReflectingBodyElementEventHandlerSet =
+  new Set(['blur', 'error', 'focus', 'load', 'resize', 'scroll']);
+
+function handlersInInterface(mainIDL, name) {
+  return mainIDL.find(idl => idl.name === name).members.map(member => member.name.slice(2));
+}
+
+const handlersListPromise = fetch("/interfaces/html.idl").then(res => res.text()).then(htmlIDL => {
+  const parsedHTMLIDL = WebIDL2.parse(htmlIDL);
+  const windowEventHandlers = handlersInInterface(parsedHTMLIDL, "WindowEventHandlers");
+  const globalEventHandlers = handlersInInterface(parsedHTMLIDL, "GlobalEventHandlers");
+  const documentAndElementEventHandlers = handlersInInterface(parsedHTMLIDL, "DocumentAndElementEventHandlers");
+
+  const shadowedHandlers = [
+    ...windowReflectingBodyElementEventHandlerSet,
+    ...windowEventHandlers
+  ];
+  const notShadowedHandlers = [
+    ...globalEventHandlers.filter(name => !windowReflectingBodyElementEventHandlerSet.has(name)),
+    ...documentAndElementEventHandlers
+  ];
+  return {
+    shadowedHandlers,
+    notShadowedHandlers
+  };
+});
diff --git a/third_party/blink/renderer/core/dom/README.md b/third_party/blink/renderer/core/dom/README.md
index 6a315e94..58f67a0 100644
--- a/third_party/blink/renderer/core/dom/README.md
+++ b/third_party/blink/renderer/core/dom/README.md
@@ -10,9 +10,9 @@
 [dom standard]: https://dom.spec.whatwg.org/
 
 Basically, this directory should contain only a file which is related to [DOM
-Standard]. However, for historical reasons, `Source/core/dom` directory has been
-used as if it were _misc_ directory. As a result, unfortunately, this directory
-contains a lot of files which are not directly related to DOM.
+Standard]. However, for historical reasons, `renderer/core/dom` directory has
+been used as if it were _misc_ directory. As a result, unfortunately, this
+directory contains a lot of files which are not directly related to DOM.
 
 Please don't add unrelated files to this directory any more. We are trying to
 organize the files so that developers wouldn't get confused at seeing this
@@ -208,7 +208,7 @@
 
 `TreeScope` maintains a lot of information about the underlying tree for
 efficiency. For example, TreeScope has a _id-to-element_ mapping, as
-[`TreeOrderedMap`](./TreeOrderedMap.h), so that `querySelector('#foo')` can find
+[`TreeOrderedMap`](./tree_ordered_map.h), so that `querySelector('#foo')` can find
 an element whose id attribute is "foo" in O(1). In other words,
 `root.querySelector('#foo')` can be slow if that is used in a node tree whose
 root is not `TreeScope`.
@@ -276,7 +276,7 @@
 
 Further Info:
 
-- [`TreeScope.h`](./TreeScope.h), [`TreeScope.cpp`](./TreeScope.cpp)
+- [`tree_scope.h`](./tree_scope.h), [`tree_scope.cc`](./tree_scope.cc)
 - `Node#GetTreeScope()`, `Node#ContainingTreeScope()`, `Node#IsInTreeScope()`
 
 # Composed Tree (a tree of node trees)
@@ -530,12 +530,159 @@
   - If _A_ is a shadow host, its shadow root's children
   - Otherwise, _A_'s children
 
-# Distribution and slots
+# Slots and node assignments
 
-TODO(hayato): Explain.
+Please see this
+[nice article](https://developers.google.com/web/fundamentals/web-components/shadowdom)
+how `<slot>` elements work in general.
 
-In the meantime, please see
-[Incremental Shadow DOM](https://docs.google.com/document/d/1R9J8CVaSub_nbaVQwwm3NjCoZye4feJ7ft7tVe5QerM/edit?usp=sharing).
+> _Slots_ are placeholders inside your component that users can fill with their
+> own markup.
+
+Here, I'll show some examples.
+
+## Example 1
+
+Given the following composed tree and slot assignments,
+
+Composed tree:
+
+```text
+A
+├──/shadowRoot1
+│   ├── slot1
+│   └── slot2
+├── B
+└── C
+```
+
+Slot Assignments:
+
+| slot  | slot's assigned nodes |
+| ----- | --------------------- |
+| slot1 | [C]                   |
+| slot2 | [B]                   |
+
+The flat tree would be:
+
+```text
+A
+├── slot1
+│   └── C
+└── slot2
+    └── B
+```
+
+## Example 2
+
+More complex example is here.
+
+Composed tree:
+
+```text
+A
+├──/shadowRoot1
+│   ├── B
+│   │   └── slot1
+│   ├── slot2
+│   │   └── C
+│   ├── D
+│   └── slot3
+│       ├── E
+│       └── F
+├── G
+├── H
+├── I
+└── J
+```
+
+Slot Assignments:
+
+| slot  | slot's assigned nodes    |
+| ----- | ------------------------ |
+| slot1 | [H]                      |
+| slot2 | [G, I]                   |
+| slot3 | [] (nothing is assigned) |
+
+The flat tree would be:
+
+```text
+A
+├── B
+│   └── slot1
+│       └── H
+├── slot2
+│   └── G, I
+├── D
+└── slot3
+    ├── E
+    └── F
+```
+
+- `slot2`'s child, `C`, is not shown in this flat tree because `slot2` has
+  non-empty assigned nodes, `[G, I]`, which are used as `slot2`'s children in
+  the flat tree.
+- If a slots doesn't have any assigned nodes, the slot's children are used as
+  _fallback contents_ in the flat tree. e.g. `slot3`s children in the flat tree
+  are `E` and `F`.
+- If a host's child node is assigned to nowhere, the child is not used. e.g. `J`
+
+## Example 3
+
+A slot itself can be assigned to another slot.
+
+For example, if we attach a shadow root to `B`, and put a `<slot>`, `slot4`,
+inside of the shadow tree.
+
+```text
+A
+├──/shadowRoot1
+│   ├── B
+│   │   ├──/shadowRoot2
+│   │   │   └── K
+│   │   │       └── slot4
+│   │   └── slot1
+│   ├── slot2
+│   │   └── C
+│   ├── D
+│   └── slot3
+│       ├── E
+│       └── F
+├── G
+├── H
+├── I
+└── J
+```
+
+| slot  | slot's assigned nodes    |
+| ----- | ------------------------ |
+| slot1 | [H]                      |
+| slot2 | [G, I]                   |
+| slot3 | [] (nothing is assigned) |
+| slot4 | [slot1]                  |
+
+The flat tree would be:
+
+```text
+A
+├── B
+│   └── K
+│       └── slot4
+│           └── slot1
+│               └── H
+├── slot2
+│   └── G, I
+├── D
+└── slot3
+    ├── E
+    └── F
+```
+
+# Slot Assignment Recalc
+
+Please see
+[Incremental Shadow DOM](https://docs.google.com/document/d/1R9J8CVaSub_nbaVQwwm3NjCoZye4feJ7ft7tVe5QerM/edit?usp=sharing)
+to know how assignments are recalc-ed.
 
 # FlatTreeTraversal
 
diff --git a/third_party/blink/renderer/core/dom/abort_signal.cc b/third_party/blink/renderer/core/dom/abort_signal.cc
index e0283241..03d53ab 100644
--- a/third_party/blink/renderer/core/dom/abort_signal.cc
+++ b/third_party/blink/renderer/core/dom/abort_signal.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/core/event_type_names.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/editing/frame_selection.cc b/third_party/blink/renderer/core/editing/frame_selection.cc
index c7b68dd..c1ef78a 100644
--- a/third_party/blink/renderer/core/editing/frame_selection.cc
+++ b/third_party/blink/renderer/core/editing/frame_selection.cc
@@ -1229,10 +1229,6 @@
   return layout_selection_->SelectionEnd();
 }
 
-void FrameSelection::ClearLayoutSelection() {
-  layout_selection_->ClearSelection();
-}
-
 LayoutSelectionStatus FrameSelection::ComputeLayoutSelectionStatus(
     const NGPaintFragment& text_fragment) const {
   return layout_selection_->ComputeSelectionStatus(text_fragment);
diff --git a/third_party/blink/renderer/core/editing/frame_selection.h b/third_party/blink/renderer/core/editing/frame_selection.h
index 7b1ecd42..64b02e31 100644
--- a/third_party/blink/renderer/core/editing/frame_selection.h
+++ b/third_party/blink/renderer/core/editing/frame_selection.h
@@ -248,7 +248,6 @@
 
   base::Optional<unsigned> LayoutSelectionStart() const;
   base::Optional<unsigned> LayoutSelectionEnd() const;
-  void ClearLayoutSelection();
   LayoutSelectionStatus ComputeLayoutSelectionStatus(
       const NGPaintFragment&) const;
 
diff --git a/third_party/blink/renderer/core/editing/layout_selection.cc b/third_party/blink/renderer/core/editing/layout_selection.cc
index ba5170d..b22fae2 100644
--- a/third_party/blink/renderer/core/editing/layout_selection.cc
+++ b/third_party/blink/renderer/core/editing/layout_selection.cc
@@ -376,8 +376,6 @@
   return std::move(visitor.old_selected_objects);
 }
 
-void LayoutSelection::ClearSelection() {}
-
 static base::Optional<unsigned> ComputeStartOffset(
     const LayoutObject& layout_object,
     const PositionInFlatTree& position) {
diff --git a/third_party/blink/renderer/core/editing/layout_selection.h b/third_party/blink/renderer/core/editing/layout_selection.h
index 7692fe1..a4ebfa1 100644
--- a/third_party/blink/renderer/core/editing/layout_selection.h
+++ b/third_party/blink/renderer/core/editing/layout_selection.h
@@ -48,8 +48,6 @@
   IntRect AbsoluteSelectionBounds();
   void InvalidatePaintForSelection();
 
-  // TODO(yoichio): Remove this function since this doesn't do anything.
-  void ClearSelection();
   base::Optional<unsigned> SelectionStart() const;
   base::Optional<unsigned> SelectionEnd() const;
   LayoutSelectionStatus ComputeSelectionStatus(const NGPaintFragment&) const;
diff --git a/third_party/blink/renderer/core/frame/performance_monitor.cc b/third_party/blink/renderer/core/frame/performance_monitor.cc
index 62e76346..481b0db 100644
--- a/third_party/blink/renderer/core/frame/performance_monitor.cc
+++ b/third_party/blink/renderer/core/frame/performance_monitor.cc
@@ -208,7 +208,7 @@
   if (probe.Duration() <= kLongTaskSubTaskThreshold)
     return;
   std::unique_ptr<SubTaskAttribution> sub_task_attribution =
-      SubTaskAttribution::Create(String("script-run"),
+      SubTaskAttribution::Create(AtomicString("script-run"),
                                  probe.context->Url().GetString(),
                                  probe.CaptureStartTime(), probe.Duration());
   sub_task_attributions_.push_back(std::move(sub_task_attribution));
@@ -266,7 +266,7 @@
 
   std::unique_ptr<SubTaskAttribution> sub_task_attribution =
       SubTaskAttribution::Create(
-          String("script-compile"),
+          AtomicString("script-compile"),
           String::Format("%s(%d, %d)", probe.file_name.Utf8().data(),
                          probe.line, probe.column),
           v8_compile_start_time_, v8_compile_duration);
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.cc b/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.cc
index 4bd8a95e..744cb14 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.cc
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.cc
@@ -30,6 +30,7 @@
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/core/html/forms/color_chooser_client.h"
 #include "third_party/blink/renderer/platform/graphics/color.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
index 6f2867e..d28d1a1 100644
--- a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
@@ -34,8 +34,6 @@
 static const char kTouchEventEmulationEnabled[] = "touchEventEmulationEnabled";
 static const char kMaxTouchPoints[] = "maxTouchPoints";
 static const char kEmulatedMedia[] = "emulatedMedia";
-static const char kDefaultBackgroundColorOverrideRGBA[] =
-    "defaultBackgroundColorOverrideRGBA";
 static const char kNavigatorPlatform[] = "navigatorPlatform";
 static const char kVirtualTimeBudget[] = "virtualTimeBudget";
 static const char kVirtualTimeBudgetInitalOffset[] =
@@ -52,7 +50,9 @@
 
 InspectorEmulationAgent::InspectorEmulationAgent(
     WebLocalFrameImpl* web_local_frame_impl)
-    : web_local_frame_(web_local_frame_impl) {}
+    : web_local_frame_(web_local_frame_impl),
+      default_background_color_override_rgba_(
+          &agent_state_, /*default_value=*/ WTF::String()) {}
 
 InspectorEmulationAgent::~InspectorEmulationAgent() = default;
 
@@ -91,14 +91,16 @@
   String emulated_media;
   state_->getString(EmulationAgentState::kEmulatedMedia, &emulated_media);
   setEmulatedMedia(emulated_media);
-  auto* rgba_value =
-      state_->get(EmulationAgentState::kDefaultBackgroundColorOverrideRGBA);
-  if (rgba_value) {
-    blink::protocol::ErrorSupport errors;
-    auto rgba = protocol::DOM::RGBA::fromValue(rgba_value, &errors);
-    if (!errors.hasErrors()) {
-      setDefaultBackgroundColorOverride(
-          Maybe<protocol::DOM::RGBA>(std::move(rgba)));
+  if (!default_background_color_override_rgba_.Get().IsNull()) {
+    std::unique_ptr<protocol::Value> parsed = protocol::StringUtil::parseJSON(
+        default_background_color_override_rgba_.Get());
+    if (parsed) {
+      blink::protocol::ErrorSupport errors;
+      auto rgba = protocol::DOM::RGBA::fromValue(parsed.get(), &errors);
+      if (!errors.hasErrors()) {
+        setDefaultBackgroundColorOverride(
+            Maybe<protocol::DOM::RGBA>(std::move(rgba)));
+      }
     }
   }
 
@@ -451,13 +453,13 @@
   if (!color.isJust()) {
     // Clear the override and state.
     GetWebViewImpl()->ClearBaseBackgroundColorOverride();
-    state_->remove(EmulationAgentState::kDefaultBackgroundColorOverrideRGBA);
+    default_background_color_override_rgba_.Clear();
     return Response::OK();
   }
 
   blink::protocol::DOM::RGBA* rgba = color.fromJust();
-  state_->setValue(EmulationAgentState::kDefaultBackgroundColorOverrideRGBA,
-                   rgba->toValue());
+  default_background_color_override_rgba_.Set(
+      rgba->toValue()->serialize());
   // Clamping of values is done by Color() constructor.
   int alpha = lroundf(255.0f * rgba->getA(1.0f));
   GetWebViewImpl()->SetBaseBackgroundColorOverride(
diff --git a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h
index 1688b57..5d47a67e 100644
--- a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h
@@ -122,6 +122,7 @@
   base::Optional<PendingVirtualTimePolicy> pending_virtual_time_policy_;
   bool enabled_ = false;
 
+  InspectorAgentState::String default_background_color_override_rgba_;
   DISALLOW_COPY_AND_ASSIGN(InspectorEmulationAgent);
 };
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
index b9df4c5..93b97d2 100644
--- a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
@@ -14,14 +14,8 @@
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
 
 namespace blink {
-
 using protocol::Response;
 
-namespace LogAgentState {
-static const char kLogEnabled[] = "logEnabled";
-static const char kLogViolations[] = "logViolations";
-}  // namespace LogAgentState
-
 namespace {
 
 String MessageSourceValue(MessageSource source) {
@@ -80,10 +74,11 @@
     ConsoleMessageStorage* storage,
     PerformanceMonitor* performance_monitor,
     v8_inspector::V8InspectorSession* v8_session)
-    : enabled_(false),
-      storage_(storage),
+    : storage_(storage),
       performance_monitor_(performance_monitor),
-      v8_session_(v8_session) {}
+      v8_session_(v8_session),
+      enabled_(&agent_state_, /*default_value=*/false),
+      violation_thresholds_(&agent_state_, -1.0) {}
 
 InspectorLogAgent::~InspectorLogAgent() = default;
 
@@ -95,19 +90,23 @@
 }
 
 void InspectorLogAgent::Restore() {
-  if (!state_->booleanProperty(LogAgentState::kLogEnabled, false))
+  if (!enabled_.Get())
     return;
-  enable();
-  protocol::Value* config = state_->get(LogAgentState::kLogViolations);
-  if (config) {
-    protocol::ErrorSupport errors;
-    startViolationsReport(
-        protocol::Array<ViolationSetting>::fromValue(config, &errors));
+  InnerEnable();
+  if (violation_thresholds_.IsEmpty())
+    return;
+  auto settings = protocol::Array<ViolationSetting>::create();
+  for (const WTF::String& key : violation_thresholds_.Keys()) {
+    settings->addItem(ViolationSetting::create()
+                          .setName(key)
+                          .setThreshold(violation_thresholds_.Get(key))
+                          .build());
   }
+  startViolationsReport(std::move(settings));
 }
 
 void InspectorLogAgent::ConsoleMessageAdded(ConsoleMessage* message) {
-  DCHECK(enabled_);
+  DCHECK(enabled_.Get());
 
   std::unique_ptr<protocol::Log::LogEntry> entry =
       protocol::Log::LogEntry::create()
@@ -163,13 +162,8 @@
   GetFrontend()->flush();
 }
 
-Response InspectorLogAgent::enable() {
-  if (enabled_)
-    return Response::OK();
+void InspectorLogAgent::InnerEnable() {
   instrumenting_agents_->addInspectorLogAgent(this);
-  state_->setBoolean(LogAgentState::kLogEnabled, true);
-  enabled_ = true;
-
   if (storage_->ExpiredCount()) {
     std::unique_ptr<protocol::Log::LogEntry> expired =
         protocol::Log::LogEntry::create()
@@ -184,15 +178,21 @@
   }
   for (size_t i = 0; i < storage_->size(); ++i)
     ConsoleMessageAdded(storage_->at(i));
+}
+
+Response InspectorLogAgent::enable() {
+  if (enabled_.Get())
+    return Response::OK();
+  enabled_.Set(true);
+  InnerEnable();
   return Response::OK();
 }
 
 Response InspectorLogAgent::disable() {
-  if (!enabled_)
+  if (!enabled_.Get())
     return Response::OK();
-  state_->setBoolean(LogAgentState::kLogEnabled, false);
+  enabled_.Clear();
   stopViolationsReport();
-  enabled_ = false;
   instrumenting_agents_->removeInspectorLogAgent(this);
   return Response::OK();
 }
@@ -222,27 +222,27 @@
 
 Response InspectorLogAgent::startViolationsReport(
     std::unique_ptr<protocol::Array<ViolationSetting>> settings) {
-  if (!enabled_)
+  if (!enabled_.Get())
     return Response::Error("Log is not enabled");
-  state_->setValue(LogAgentState::kLogViolations, settings->toValue());
   if (!performance_monitor_)
     return Response::Error("Violations are not supported for this target");
   performance_monitor_->UnsubscribeAll(this);
+  violation_thresholds_.ClearAll();
   for (size_t i = 0; i < settings->length(); ++i) {
-    PerformanceMonitor::Violation violation =
-        ParseViolation(settings->get(i)->getName());
+    const WTF::String& name = settings->get(i)->getName();
+    double threshold = settings->get(i)->getThreshold();
+    PerformanceMonitor::Violation violation = ParseViolation(name);
     if (violation == PerformanceMonitor::kAfterLast)
       continue;
     performance_monitor_->Subscribe(
-        violation,
-        base::TimeDelta::FromMillisecondsD(settings->get(i)->getThreshold()),
-        this);
+        violation, base::TimeDelta::FromMillisecondsD(threshold), this);
+    violation_thresholds_.Set(name, threshold);
   }
   return Response::OK();
 }
 
 Response InspectorLogAgent::stopViolationsReport() {
-  state_->remove(LogAgentState::kLogViolations);
+  violation_thresholds_.ClearAll();
   if (!performance_monitor_)
     return Response::Error("Violations are not supported for this target");
   performance_monitor_->UnsubscribeAll(this);
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.h b/third_party/blink/renderer/core/inspector/inspector_log_agent.h
index 5ff38f0..8b46b31 100644
--- a/third_party/blink/renderer/core/inspector/inspector_log_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.h
@@ -53,11 +53,13 @@
                               const String& text,
                               base::TimeDelta time,
                               SourceLocation*) override;
+  void InnerEnable();
 
-  bool enabled_;
   Member<ConsoleMessageStorage> storage_;
   Member<PerformanceMonitor> performance_monitor_;
   v8_inspector::V8InspectorSession* v8_session_;
+  InspectorAgentState::Boolean enabled_;
+  InspectorAgentState::DoubleMap violation_thresholds_;
   DISALLOW_COPY_AND_ASSIGN(InspectorLogAgent);
 };
 
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index 03578c25..28ed3f3 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -2930,13 +2930,6 @@
     // TODO(mstensho): figure out if we need this. We have no test coverage for
     // it. It looks like all line boxes have been removed at this point.
     if (FirstLineBox()) {
-      // We can't wait for LayoutBox::destroy to clear the selection,
-      // because by then we will have nuked the line boxes.
-      // FIXME: The FrameSelection should be responsible for this when it
-      // is notified of DOM mutations.
-      if (IsSelectionBorder())
-        View()->ClearSelection();
-
       // If we are an anonymous block, then our line boxes might have children
       // that will outlast this block. In the non-anonymous block case those
       // children will be destroyed by the time we return from this function.
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 88438985..a3cfcfa 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2422,7 +2422,7 @@
       // Convert rect into coordinate space of parent to apply parent's
       // reflection and filter.
       LayoutSize parent_offset =
-          parent->OffsetFromAncestorContainer(&container);
+          parent->OffsetFromAncestor(&container);
       transform_state.Move(-parent_offset);
       ToLayoutBox(parent)->InflateVisualRectForFilter(transform_state);
       transform_state.Move(parent_offset);
@@ -2511,7 +2511,7 @@
     // If the ancestor is below the container, then we need to map the rect into
     // ancestor's coordinates.
     LayoutSize container_offset =
-        ancestor->OffsetFromAncestorContainer(container);
+        ancestor->OffsetFromAncestor(container);
     transform_state.Move(-container_offset, accumulation);
     return true;
   }
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
index 778ffee..a2beac2 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -1300,7 +1300,7 @@
     // because transforms create containers, so it should be safe to just
     // subtract the delta between the container and ancestor_to_stop_at.
     LayoutSize ancestor_offset =
-        ancestor_to_stop_at->OffsetFromAncestorContainer(container);
+        ancestor_to_stop_at->OffsetFromAncestor(container);
     adjustment_for_skipped_ancestor.Translate(
         -ancestor_offset.Width().ToFloat(),
         -ancestor_offset.Height().ToFloat());
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index a49c9ae5..22a4073 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -105,13 +105,6 @@
 
   if (!DocumentBeingDestroyed()) {
     if (FirstLineBox()) {
-      // We can't wait for LayoutBoxModelObject::destroy to clear the selection,
-      // because by then we will have nuked the line boxes.
-      // FIXME: The FrameSelection should be responsible for this when it
-      // is notified of DOM mutations.
-      if (IsSelectionBorder())
-        View()->ClearSelection();
-
       // If line boxes are contained inside a root, that means we're an inline.
       // In that case, we need to remove all the line boxes so that the parent
       // lines aren't pointing to deleted children. If the first line box does
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index 7ce1cd5..54d0f36b 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2521,7 +2521,7 @@
     // create containers, so it should be safe to just subtract the delta
     // between the ancestor and |o|.
     LayoutSize container_offset =
-        ancestor->OffsetFromAncestorContainer(container);
+        ancestor->OffsetFromAncestor(container);
     transform_state.Move(-container_offset.Width(), -container_offset.Height(),
                          preserve3d ? TransformState::kAccumulateTransform
                                     : TransformState::kFlattenTransform);
@@ -2603,7 +2603,7 @@
   }
 
   if (skip_info.AncestorSkipped()) {
-    container_offset = ancestor->OffsetFromAncestorContainer(container);
+    container_offset = ancestor->OffsetFromAncestor(container);
     transform_state.Move(-container_offset.Width(), -container_offset.Height());
     // If the ancestor is fixed, then the rect is already in its coordinates so
     // doesn't need viewport-adjusting.
@@ -2758,7 +2758,7 @@
                     box->OriginAdjustmentForScrollbars());
 }
 
-LayoutSize LayoutObject::OffsetFromAncestorContainer(
+LayoutSize LayoutObject::OffsetFromAncestor(
     const LayoutObject* ancestor_container) const {
   if (ancestor_container == this)
     return LayoutSize();
@@ -2766,10 +2766,12 @@
   LayoutSize offset;
   LayoutPoint reference_point;
   const LayoutObject* curr_container = this;
+  AncestorSkipInfo skip_info(ancestor_container);
   do {
-    const LayoutObject* next_container = curr_container->Container();
+    const LayoutObject* next_container = curr_container->Container(&skip_info);
+
     // This means we reached the top without finding container.
-    DCHECK(next_container);
+    CHECK(next_container);
     if (!next_container)
       break;
     DCHECK(!curr_container->HasTransformRelatedProperty());
@@ -2778,7 +2780,12 @@
     offset += current_offset;
     reference_point.Move(current_offset);
     curr_container = next_container;
-  } while (curr_container != ancestor_container);
+  } while (curr_container != ancestor_container &&
+           !skip_info.AncestorSkipped());
+  if (skip_info.AncestorSkipped()) {
+    DCHECK(curr_container);
+    offset -= ancestor_container->OffsetFromAncestor(curr_container);
+  }
 
   return offset;
 }
@@ -2807,7 +2814,7 @@
     if (container) {
       current_layer = container->EnclosingLayer();
       if (current_layer->GetLayoutObject() != container) {
-        layer_offset.Move(container->OffsetFromAncestorContainer(
+        layer_offset.Move(container->OffsetFromAncestor(
             &current_layer->GetLayoutObject()));
         // If the layer itself is scrolled, we have to undo the subtraction of
         // its scroll offset since we want the offset relative to the scrolling
@@ -2983,12 +2990,6 @@
   return Parent();
 }
 
-bool LayoutObject::IsSelectionBorder() const {
-  SelectionState st = GetSelectionState();
-  return st == SelectionState::kStart || st == SelectionState::kEnd ||
-         st == SelectionState::kStartAndEnd;
-}
-
 inline void LayoutObject::ClearLayoutRootIfNeeded() const {
   if (LocalFrameView* view = GetFrameView()) {
     if (!DocumentBeingDestroyed())
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index d9898fc..851b7788 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -890,8 +890,6 @@
     return bitfields_.ChildNeedsOverflowRecalcAfterStyleChange();
   }
 
-  bool IsSelectionBorder() const;
-
   // CSS clip only applies when position is absolute or fixed. Prefer this check
   // over !Style()->HasAutoClip().
   bool HasClip() const {
@@ -1372,9 +1370,9 @@
   // and multicol).
   LayoutSize OffsetFromContainer(const LayoutObject*,
                                  bool ignore_scroll_offset = false) const;
-  // Return the offset from an object up the container() chain. Asserts that
-  // none of the intermediate objects have transforms.
-  LayoutSize OffsetFromAncestorContainer(const LayoutObject*) const;
+  // Return the offset from an object from the ancestor. The ancestor need
+  // not be on the containing block chain of |this|.
+  LayoutSize OffsetFromAncestor(const LayoutObject*) const;
 
   virtual void AbsoluteRects(Vector<IntRect>&, const LayoutPoint&) const {}
 
diff --git a/third_party/blink/renderer/core/layout/layout_object_child_list.cc b/third_party/blink/renderer/core/layout/layout_object_child_list.cc
index 985e6b03..0e90cd0 100644
--- a/third_party/blink/renderer/core/layout/layout_object_child_list.cc
+++ b/third_party/blink/renderer/core/layout/layout_object_child_list.cc
@@ -101,13 +101,6 @@
     ToLayoutBox(old_child)->DeleteLineBoxWrapper();
 
   if (!owner->DocumentBeingDestroyed()) {
-    // If oldChild is the start or end of the selection, then clear the
-    // selection to avoid problems of invalid pointers.
-    // FIXME: The FrameSelection should be responsible for this when it
-    // is notified of DOM mutations.
-    if (old_child->IsSelectionBorder() && owner->View())
-      owner->View()->ClearSelection();
-
     owner->NotifyOfSubtreeChange();
 
     if (notify_layout_object) {
diff --git a/third_party/blink/renderer/core/layout/layout_object_test.cc b/third_party/blink/renderer/core/layout/layout_object_test.cc
index e72b057..c611605c 100644
--- a/third_party/blink/renderer/core/layout/layout_object_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_object_test.cc
@@ -264,6 +264,22 @@
   EXPECT_EQ(container, floating->ContainingBlock());
 }
 
+TEST_F(LayoutObjectTest, InlineFloatMismatch) {
+  SetBodyInnerHTML(R"HTML(
+    <span id=span style='position: relative; left: 40px; width: 100px; height: 100px'>
+      <div id=float_obj style='float: left; margin-left: 10px;'>
+      </div>
+    </span>
+  )HTML");
+
+  LayoutObject* float_obj =
+      ToLayoutBoxModelObject(GetLayoutObjectByElementId("float_obj"));
+  LayoutObject* span =
+      ToLayoutBoxModelObject(GetLayoutObjectByElementId("span"));
+  // 10px for margin, -40px because float is to the left of the span.
+  EXPECT_EQ(LayoutSize(-30, 0), float_obj->OffsetFromAncestor(span));
+}
+
 TEST_F(LayoutObjectTest, FloatUnderInline) {
   SetBodyInnerHTML(R"HTML(
     <div id='layered-div' style='position: absolute'>
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc
index df7732d..59d094b9 100644
--- a/third_party/blink/renderer/core/layout/layout_view.cc
+++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -594,10 +594,6 @@
       FloatRect(FloatPoint(), FloatSize(Layer()->Size())), mode));
 }
 
-void LayoutView::ClearSelection() {
-  frame_view_->GetFrame().Selection().ClearLayoutSelection();
-}
-
 void LayoutView::CommitPendingSelection() {
   TRACE_EVENT0("blink", "LayoutView::commitPendingSelection");
   DCHECK(!NeedsLayout());
diff --git a/third_party/blink/renderer/core/layout/layout_view.h b/third_party/blink/renderer/core/layout/layout_view.h
index 0954c1e..c2a41d8b 100644
--- a/third_party/blink/renderer/core/layout/layout_view.h
+++ b/third_party/blink/renderer/core/layout/layout_view.h
@@ -146,7 +146,6 @@
       const PaintInfo&,
       const LayoutPoint& paint_offset) const override;
 
-  void ClearSelection();
   void CommitPendingSelection();
 
   void AbsoluteRects(Vector<IntRect>&,
diff --git a/third_party/blink/renderer/core/loader/threadable_loader_test.cc b/third_party/blink/renderer/core/loader/threadable_loader_test.cc
index f346c48d..600bc9f 100644
--- a/third_party/blink/renderer/core/loader/threadable_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/threadable_loader_test.cc
@@ -168,55 +168,37 @@
   kWorkerThreadableLoaderTest,
 };
 
-class ThreadableLoaderTestHelper {
+class ThreadableLoaderTestHelper final {
  public:
-  virtual ~ThreadableLoaderTestHelper() = default;
-
-  virtual void CreateLoader(ThreadableLoaderClient*) = 0;
-  virtual void StartLoader(const ResourceRequest&) = 0;
-  virtual void CancelLoader() = 0;
-  virtual void CancelAndClearLoader() = 0;
-  virtual void ClearLoader() = 0;
-  virtual Checkpoint& GetCheckpoint() = 0;
-  virtual void CallCheckpoint(int) = 0;
-  virtual void OnSetUp() = 0;
-  virtual void OnServeRequests() = 0;
-  virtual void OnTearDown() = 0;
-};
-
-class DocumentThreadableLoaderTestHelper : public ThreadableLoaderTestHelper {
- public:
-  DocumentThreadableLoaderTestHelper()
+  ThreadableLoaderTestHelper()
       : dummy_page_holder_(DummyPageHolder::Create(IntSize(1, 1))) {
     GetDocument().SetURL(KURL("http://fake.url/"));
     GetDocument().SetSecurityOrigin(
         SecurityOrigin::Create(KURL("http://fake.url/")));
   }
 
-  void CreateLoader(ThreadableLoaderClient* client) override {
+  void CreateLoader(ThreadableLoaderClient* client) {
     ResourceLoaderOptions resource_loader_options;
     loader_ = new ThreadableLoader(GetDocument(), client,
                                    resource_loader_options);
   }
 
-  void StartLoader(const ResourceRequest& request) override {
-    loader_->Start(request);
-  }
+  void StartLoader(const ResourceRequest& request) { loader_->Start(request); }
 
-  void CancelLoader() override { loader_->Cancel(); }
-  void CancelAndClearLoader() override {
+  void CancelLoader() { loader_->Cancel(); }
+  void CancelAndClearLoader() {
     loader_->Cancel();
     loader_ = nullptr;
   }
-  void ClearLoader() override { loader_ = nullptr; }
-  Checkpoint& GetCheckpoint() override { return checkpoint_; }
-  void CallCheckpoint(int n) override { checkpoint_.Call(n); }
+  void ClearLoader() { loader_ = nullptr; }
+  Checkpoint& GetCheckpoint() { return checkpoint_; }
+  void CallCheckpoint(int n) { checkpoint_.Call(n); }
 
-  void OnSetUp() override { SetUpMockURLs(); }
+  void OnSetUp() { SetUpMockURLs(); }
 
-  void OnServeRequests() override { ServeAsynchronousRequests(); }
+  void OnServeRequests() { ServeAsynchronousRequests(); }
 
-  void OnTearDown() override {
+  void OnTearDown() {
     if (loader_) {
       loader_->Cancel();
       loader_ = nullptr;
@@ -232,226 +214,10 @@
   Persistent<ThreadableLoader> loader_;
 };
 
-class WebWorkerFetchContextForTest : public WebWorkerFetchContext {
+class ThreadableLoaderTest : public testing::Test {
  public:
-  WebWorkerFetchContextForTest(KURL site_for_cookies)
-      : site_for_cookies_(site_for_cookies.Copy()) {}
-  void SetTerminateSyncLoadEvent(base::WaitableEvent*) override {}
-  void InitializeOnWorkerThread() override {}
-
-  std::unique_ptr<WebURLLoaderFactory> CreateURLLoaderFactory() override {
-    return std::make_unique<WebURLLoaderFactoryWithMock>(
-        Platform::Current()->GetURLLoaderMockFactory());
-  }
-  std::unique_ptr<WebURLLoaderFactory> WrapURLLoaderFactory(
-      mojo::ScopedMessagePipeHandle) override {
-    return std::make_unique<WebURLLoaderFactoryWithMock>(
-        Platform::Current()->GetURLLoaderMockFactory());
-  }
-
-  void WillSendRequest(WebURLRequest&) override {}
-  blink::mojom::ControllerServiceWorkerMode IsControlledByServiceWorker()
-      const override {
-    return blink::mojom::ControllerServiceWorkerMode::kNoController;
-  }
-  WebURL SiteForCookies() const override { return site_for_cookies_; }
-
- private:
-  WebURL site_for_cookies_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebWorkerFetchContextForTest);
-};
-
-class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper {
- public:
-  WorkerThreadableLoaderTestHelper()
-      : dummy_page_holder_(DummyPageHolder::Create(IntSize(1, 1))) {
-    GetDocument().SetURL(KURL("http://fake.url/"));
-  }
-
-  void CreateLoader(ThreadableLoaderClient* client) override {
-    std::unique_ptr<WaitableEvent> completion_event =
-        std::make_unique<WaitableEvent>();
-    PostCrossThreadTask(
-        *worker_loading_task_runner_, FROM_HERE,
-        CrossThreadBind(&WorkerThreadableLoaderTestHelper::WorkerCreateLoader,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(client),
-                        CrossThreadUnretained(completion_event.get())));
-    completion_event->Wait();
-  }
-
-  void StartLoader(const ResourceRequest& request) override {
-    std::unique_ptr<WaitableEvent> completion_event =
-        std::make_unique<WaitableEvent>();
-    PostCrossThreadTask(
-        *worker_loading_task_runner_, FROM_HERE,
-        CrossThreadBind(&WorkerThreadableLoaderTestHelper::WorkerStartLoader,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(completion_event.get()),
-                        request));
-    completion_event->Wait();
-  }
-
-  // Must be called on the worker thread.
-  void CancelLoader() override {
-    DCHECK(worker_thread_);
-    DCHECK(worker_thread_->IsCurrentThread());
-    loader_->Cancel();
-  }
-
-  void CancelAndClearLoader() override {
-    DCHECK(worker_thread_);
-    DCHECK(worker_thread_->IsCurrentThread());
-    loader_->Cancel();
-    loader_ = nullptr;
-  }
-
-  // Must be called on the worker thread.
-  void ClearLoader() override {
-    DCHECK(worker_thread_);
-    DCHECK(worker_thread_->IsCurrentThread());
-    loader_ = nullptr;
-  }
-
-  Checkpoint& GetCheckpoint() override { return checkpoint_; }
-
-  void CallCheckpoint(int n) override {
-    test::RunPendingTasks();
-
-    std::unique_ptr<WaitableEvent> completion_event =
-        std::make_unique<WaitableEvent>();
-    PostCrossThreadTask(
-        *worker_loading_task_runner_, FROM_HERE,
-        CrossThreadBind(&WorkerThreadableLoaderTestHelper::WorkerCallCheckpoint,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(completion_event.get()), n));
-    completion_event->Wait();
-  }
-
-  void OnSetUp() override {
-    reporting_proxy_ = std::make_unique<WorkerReportingProxy>();
-    security_origin_ = GetDocument().GetSecurityOrigin();
-    parent_execution_context_task_runners_ =
-        ParentExecutionContextTaskRunners::Create(&GetDocument());
-    worker_thread_ = std::make_unique<WorkerThreadForTest>(*reporting_proxy_);
-    WorkerClients* worker_clients = WorkerClients::Create();
-
-    ProvideWorkerFetchContextToWorker(
-        worker_clients, std::make_unique<WebWorkerFetchContextForTest>(
-                            GetDocument().SiteForCookies()));
-    worker_thread_->StartWithSourceCode(
-        security_origin_.get(), "//fake source code",
-        parent_execution_context_task_runners_.Get(), GetDocument().Url(),
-        worker_clients);
-    worker_thread_->WaitForInit();
-    worker_loading_task_runner_ =
-        worker_thread_->GetTaskRunner(TaskType::kInternalTest);
-
-    PostCrossThreadTask(*worker_loading_task_runner_, FROM_HERE,
-                        CrossThreadBind(&SetUpMockURLs));
-    WaitForWorkerThreadSignal();
-  }
-
-  void OnServeRequests() override {
-    test::RunPendingTasks();
-    PostCrossThreadTask(*worker_loading_task_runner_, FROM_HERE,
-                        CrossThreadBind(&ServeAsynchronousRequests));
-    WaitForWorkerThreadSignal();
-  }
-
-  void OnTearDown() override {
-    PostCrossThreadTask(
-        *worker_loading_task_runner_, FROM_HERE,
-        CrossThreadBind(&WorkerThreadableLoaderTestHelper::ClearLoader,
-                        CrossThreadUnretained(this)));
-    WaitForWorkerThreadSignal();
-    PostCrossThreadTask(*worker_loading_task_runner_, FROM_HERE,
-                        CrossThreadBind(&UnregisterAllURLsAndClearMemoryCache));
-    WaitForWorkerThreadSignal();
-
-    worker_thread_->Terminate();
-    worker_thread_->WaitForShutdownForTesting();
-
-    // Needed to clean up the things on the main thread side and
-    // avoid Resource leaks.
-    test::RunPendingTasks();
-  }
-
- private:
-  Document& GetDocument() { return dummy_page_holder_->GetDocument(); }
-
-  void WorkerCreateLoader(ThreadableLoaderClient* client,
-                          WaitableEvent* event) {
-    DCHECK(worker_thread_);
-    DCHECK(worker_thread_->IsCurrentThread());
-
-    ResourceLoaderOptions resource_loader_options;
-
-    // Ensure that ThreadableLoader is created.
-    DCHECK(worker_thread_->GlobalScope()->IsWorkerGlobalScope());
-
-    loader_ = new ThreadableLoader(*worker_thread_->GlobalScope(), client,
-                                   resource_loader_options);
-    DCHECK(loader_);
-    event->Signal();
-  }
-
-  void WorkerStartLoader(
-      WaitableEvent* event,
-      std::unique_ptr<CrossThreadResourceRequestData> request_data) {
-    DCHECK(worker_thread_);
-    DCHECK(worker_thread_->IsCurrentThread());
-
-    ResourceRequest request(request_data.get());
-    request.SetFetchCredentialsMode(
-        network::mojom::FetchCredentialsMode::kOmit);
-    loader_->Start(request);
-    event->Signal();
-  }
-
-  void WorkerCallCheckpoint(WaitableEvent* event, int n) {
-    DCHECK(worker_thread_);
-    DCHECK(worker_thread_->IsCurrentThread());
-    checkpoint_.Call(n);
-    event->Signal();
-  }
-
-  void WaitForWorkerThreadSignal() {
-    WaitableEvent event;
-    PostCrossThreadTask(
-        *worker_loading_task_runner_, FROM_HERE,
-        CrossThreadBind(&WaitableEvent::Signal, CrossThreadUnretained(&event)));
-    event.Wait();
-  }
-
-  scoped_refptr<const SecurityOrigin> security_origin_;
-  std::unique_ptr<WorkerReportingProxy> reporting_proxy_;
-  std::unique_ptr<WorkerThreadForTest> worker_thread_;
-
-  std::unique_ptr<DummyPageHolder> dummy_page_holder_;
-  // Accessed cross-thread when worker thread posts tasks to the parent.
-  CrossThreadPersistent<ParentExecutionContextTaskRunners>
-      parent_execution_context_task_runners_;
-  scoped_refptr<base::SingleThreadTaskRunner> worker_loading_task_runner_;
-  Checkpoint checkpoint_;
-  // |m_loader| must be touched only from the worker thread only.
-  CrossThreadPersistent<ThreadableLoader> loader_;
-};
-
-class ThreadableLoaderTest
-    : public testing::TestWithParam<ThreadableLoaderToTest> {
- public:
-  ThreadableLoaderTest() {
-    switch (GetParam()) {
-      case kDocumentThreadableLoaderTest:
-        helper_ = std::make_unique<DocumentThreadableLoaderTestHelper>();
-        break;
-      case kWorkerThreadableLoaderTest:
-        helper_ = std::make_unique<WorkerThreadableLoaderTestHelper>();
-        break;
-    }
-  }
+  ThreadableLoaderTest()
+      : helper_(std::make_unique<ThreadableLoaderTestHelper>()) {}
 
   void StartLoader(const KURL& url,
                    network::mojom::FetchRequestMode fetch_request_mode =
@@ -492,17 +258,9 @@
   std::unique_ptr<ThreadableLoaderTestHelper> helper_;
 };
 
-INSTANTIATE_TEST_CASE_P(Document,
-                        ThreadableLoaderTest,
-                        testing::Values(kDocumentThreadableLoaderTest));
+TEST_F(ThreadableLoaderTest, StartAndStop) {}
 
-INSTANTIATE_TEST_CASE_P(Worker,
-                        ThreadableLoaderTest,
-                        testing::Values(kWorkerThreadableLoaderTest));
-
-TEST_P(ThreadableLoaderTest, StartAndStop) {}
-
-TEST_P(ThreadableLoaderTest, CancelAfterStart) {
+TEST_F(ThreadableLoaderTest, CancelAfterStart) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -519,7 +277,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelAndClearAfterStart) {
+TEST_F(ThreadableLoaderTest, CancelAndClearAfterStart) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -537,7 +295,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInDidReceiveResponse) {
+TEST_F(ThreadableLoaderTest, CancelInDidReceiveResponse) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -553,7 +311,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelAndClearInDidReceiveResponse) {
+TEST_F(ThreadableLoaderTest, CancelAndClearInDidReceiveResponse) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -570,7 +328,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInDidReceiveData) {
+TEST_F(ThreadableLoaderTest, CancelInDidReceiveData) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -587,7 +345,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelAndClearInDidReceiveData) {
+TEST_F(ThreadableLoaderTest, CancelAndClearInDidReceiveData) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -605,7 +363,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, DidFinishLoading) {
+TEST_F(ThreadableLoaderTest, DidFinishLoading) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -623,7 +381,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInDidFinishLoading) {
+TEST_F(ThreadableLoaderTest, CancelInDidFinishLoading) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -641,7 +399,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, ClearInDidFinishLoading) {
+TEST_F(ThreadableLoaderTest, ClearInDidFinishLoading) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -659,7 +417,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, DidFail) {
+TEST_F(ThreadableLoaderTest, DidFail) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -674,7 +432,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInDidFail) {
+TEST_F(ThreadableLoaderTest, CancelInDidFail) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -690,7 +448,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, ClearInDidFail) {
+TEST_F(ThreadableLoaderTest, ClearInDidFail) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -706,7 +464,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, DidFailInStart) {
+TEST_F(ThreadableLoaderTest, DidFailInStart) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -724,7 +482,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInDidFailInStart) {
+TEST_F(ThreadableLoaderTest, CancelInDidFailInStart) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -739,7 +497,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, ClearInDidFailInStart) {
+TEST_F(ThreadableLoaderTest, ClearInDidFailInStart) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -754,7 +512,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, DidFailAccessControlCheck) {
+TEST_F(ThreadableLoaderTest, DidFailAccessControlCheck) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -772,7 +530,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, RedirectDidFinishLoading) {
+TEST_F(ThreadableLoaderTest, RedirectDidFinishLoading) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -789,7 +547,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInRedirectDidFinishLoading) {
+TEST_F(ThreadableLoaderTest, CancelInRedirectDidFinishLoading) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -807,7 +565,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, ClearInRedirectDidFinishLoading) {
+TEST_F(ThreadableLoaderTest, ClearInRedirectDidFinishLoading) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -825,7 +583,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, DidFailRedirectCheck) {
+TEST_F(ThreadableLoaderTest, DidFailRedirectCheck) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -839,7 +597,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, CancelInDidFailRedirectCheck) {
+TEST_F(ThreadableLoaderTest, CancelInDidFailRedirectCheck) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -854,7 +612,7 @@
   ServeRequests();
 }
 
-TEST_P(ThreadableLoaderTest, ClearInDidFailRedirectCheck) {
+TEST_F(ThreadableLoaderTest, ClearInDidFailRedirectCheck) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
@@ -871,7 +629,7 @@
 
 // This test case checks blink doesn't crash even when the response arrives
 // synchronously.
-TEST_P(ThreadableLoaderTest, GetResponseSynchronously) {
+TEST_F(ThreadableLoaderTest, GetResponseSynchronously) {
   InSequence s;
   EXPECT_CALL(GetCheckpoint(), Call(1));
   CreateLoader();
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc
index 380a77d..5348f488 100644
--- a/third_party/blink/renderer/core/page/drag_controller.cc
+++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -478,25 +478,26 @@
   // UpdateStyleAndLayoutIgnorePendingStylesheets
   // needs to be audited.  See http://crbug.com/590369 for more details.
   frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-  if (frame->Selection().ComputeVisibleSelectionInDOMTree().IsNone()) {
-    const PositionWithAffinity& position = frame->PositionForPoint(point);
-    if (!position.IsConnected())
-      return false;
-
-    frame->Selection().SetSelectionAndEndTyping(
-        SelectionInDOMTree::Builder().Collapse(position).Build());
-    // TODO(editing-dev): The use of
-    // UpdateStyleAndLayoutIgnorePendingStylesheets
-    // needs to be audited.  See http://crbug.com/590369 for more details.
-    frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-    const VisibleSelection& drag_caret =
-        frame->Selection().ComputeVisibleSelectionInDOMTree();
-    range = CreateRange(drag_caret.ToNormalizedEphemeralRange());
+  if (!frame->Selection().ComputeVisibleSelectionInDOMTree().IsNone()) {
+    return frame->Selection()
+        .ComputeVisibleSelectionInDOMTree()
+        .IsContentEditable();
   }
-  return !frame->Selection().ComputeVisibleSelectionInDOMTree().IsNone() &&
-         frame->Selection()
-             .ComputeVisibleSelectionInDOMTree()
-             .IsContentEditable();
+
+  const PositionWithAffinity& position = frame->PositionForPoint(point);
+  if (!position.IsConnected())
+    return false;
+
+  frame->Selection().SetSelectionAndEndTyping(
+      SelectionInDOMTree::Builder().Collapse(position).Build());
+  // TODO(editing-dev): The use of
+  // UpdateStyleAndLayoutIgnorePendingStylesheets
+  // needs to be audited.  See http://crbug.com/590369 for more details.
+  frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
+  const VisibleSelection& visible_selection =
+      frame->Selection().ComputeVisibleSelectionInDOMTree();
+  range = CreateRange(visible_selection.ToNormalizedEphemeralRange());
+  return !visible_selection.IsNone() && visible_selection.IsContentEditable();
 }
 
 DispatchEventResult DragController::DispatchTextInputEventFor(
diff --git a/third_party/blink/renderer/core/paint/list_marker_painter.cc b/third_party/blink/renderer/core/paint/list_marker_painter.cc
index a591be9..823fafa0 100644
--- a/third_party/blink/renderer/core/paint/list_marker_painter.cc
+++ b/third_party/blink/renderer/core/paint/list_marker_painter.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/paint/list_marker_painter.h"
 
-#include "third_party/blink/renderer/core/layout/api/selection_state.h"
 #include "third_party/blink/renderer/core/layout/layout_list_item.h"
 #include "third_party/blink/renderer/core/layout/layout_list_marker.h"
 #include "third_party/blink/renderer/core/layout/list_marker_text.h"
@@ -90,15 +89,6 @@
                        layout_list_marker_.StyleRef(), FloatSize(marker.Size()))
             .get(),
         Image::kSyncDecode, FloatRect(marker));
-    if (layout_list_marker_.GetSelectionState() != SelectionState::kNone) {
-      LayoutRect sel_rect = layout_list_marker_.LocalSelectionRect();
-      sel_rect.MoveBy(box_origin);
-      Color selection_bg = SelectionPaintingUtils::SelectionBackgroundColor(
-          layout_list_marker_.ListItem()->GetDocument(),
-          layout_list_marker_.ListItem()->StyleRef(),
-          layout_list_marker_.ListItem()->GetNode());
-      context.FillRect(PixelSnappedIntRect(sel_rect), selection_bg);
-    }
     return;
   }
 
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 61b7131..8112754 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1017,7 +1017,7 @@
   LayoutPoint result = child->VisualOffsetFromAncestor(painting_layer);
   if (!paint_offset_root->HasLayer() ||
       ToLayoutBoxModelObject(paint_offset_root)->Layer() != painting_layer) {
-    result.Move(-paint_offset_root->OffsetFromAncestorContainer(
+    result.Move(-paint_offset_root->OffsetFromAncestor(
         &painting_layer->GetLayoutObject()));
   }
 
diff --git a/third_party/blink/renderer/core/paint/theme_painter_default.cc b/third_party/blink/renderer/core/paint/theme_painter_default.cc
index 7e32057..5f683ff0 100644
--- a/third_party/blink/renderer/core/paint/theme_painter_default.cc
+++ b/third_party/blink/renderer/core/paint/theme_painter_default.cc
@@ -128,7 +128,7 @@
                               const IntRect& local_offset) {
   // Compute an offset between the partLayoutObject and the inputLayoutObject.
   LayoutSize offset_from_input_layout_object =
-      -part_layout_object.OffsetFromAncestorContainer(&input_layout_object);
+      -part_layout_object.OffsetFromAncestor(&input_layout_object);
   // Move the rect into partLayoutObject's coords.
   part_rect.Move(offset_from_input_layout_object);
   // Account for the local drawing offset.
@@ -466,7 +466,7 @@
   // pixel off-center, it will be one pixel closer to the bottom of the field.
   // This tends to look better with the text.
   LayoutRect cancel_button_rect(
-      cancel_button_object.OffsetFromAncestorContainer(&input_layout_box)
+      cancel_button_object.OffsetFromAncestor(&input_layout_box)
           .Width(),
       input_content_box.Y() +
           (input_content_box.Height() - cancel_button_size + 1) / 2,
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc
index 99375ad..44bda18 100644
--- a/third_party/blink/renderer/core/timing/performance.cc
+++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -230,7 +230,7 @@
 }
 
 PerformanceEntryVector Performance::getEntriesByName(
-    const String& name,
+    const AtomicString& name,
     const AtomicString& entry_type) {
   PerformanceEntryVector entries;
   PerformanceEntry::EntryType type =
@@ -545,7 +545,7 @@
 void Performance::AddLongTaskTiming(
     TimeTicks start_time,
     TimeTicks end_time,
-    const String& name,
+    const AtomicString& name,
     const String& frame_src,
     const String& frame_id,
     const String& frame_name,
@@ -567,7 +567,7 @@
 }
 
 PerformanceMark* Performance::mark(ScriptState* script_state,
-                                   const String& mark_name,
+                                   const AtomicString& mark_name,
                                    ExceptionState& exception_state) {
   DoubleOrPerformanceMarkOptions startOrOptions;
   return this->mark(script_state, mark_name, startOrOptions, exception_state);
@@ -575,7 +575,7 @@
 
 PerformanceMark* Performance::mark(
     ScriptState* script_state,
-    const String& mark_name,
+    const AtomicString& mark_name,
     DoubleOrPerformanceMarkOptions& start_time_or_mark_options,
     ExceptionState& exception_state) {
   if (!RuntimeEnabledFeatures::CustomUserTimingEnabled()) {
@@ -610,14 +610,14 @@
   return performance_mark;
 }
 
-void Performance::clearMarks(const String& mark_name) {
+void Performance::clearMarks(const AtomicString& mark_name) {
   if (!user_timing_)
     user_timing_ = UserTiming::Create(*this);
   user_timing_->ClearMarks(mark_name);
 }
 
 PerformanceMeasure* Performance::measure(ScriptState* script_state,
-                                         const String& measure_name,
+                                         const AtomicString& measure_name,
                                          ExceptionState& exception_state) {
   return measureInternal(script_state, measure_name,
                          NativeValueTraits<StringOrDouble>::NullValue(),
@@ -628,7 +628,7 @@
 
 PerformanceMeasure* Performance::measure(
     ScriptState* script_state,
-    const String& measure_name,
+    const AtomicString& measure_name,
     const StringOrDoubleOrPerformanceMeasureOptions& start_or_options,
     ExceptionState& exception_state) {
   return measureInternal(script_state, measure_name, start_or_options,
@@ -638,7 +638,7 @@
 
 PerformanceMeasure* Performance::measure(
     ScriptState* script_state,
-    const String& measure_name,
+    const AtomicString& measure_name,
     const StringOrDoubleOrPerformanceMeasureOptions& start_or_options,
     const StringOrDouble& end,
     ExceptionState& exception_state) {
@@ -665,7 +665,7 @@
 // distinguish between (null or undefined) and empty.
 PerformanceMeasure* Performance::measureInternal(
     ScriptState* script_state,
-    const String& measure_name,
+    const AtomicString& measure_name,
     const StringOrDoubleOrPerformanceMeasureOptions& start_or_options,
     const StringOrDouble& end,
     bool end_is_empty,
@@ -743,7 +743,7 @@
 
 PerformanceMeasure* Performance::measureInternal(
     ScriptState* script_state,
-    const String& measure_name,
+    const AtomicString& measure_name,
     const StringOrDouble& start,
     const StringOrDouble& end,
     const ScriptValue& detail,
@@ -761,7 +761,7 @@
   return performance_measure;
 }
 
-void Performance::clearMeasures(const String& measure_name) {
+void Performance::clearMeasures(const AtomicString& measure_name) {
   if (!user_timing_)
     user_timing_ = UserTiming::Create(*this);
   user_timing_->ClearMeasures(measure_name);
diff --git a/third_party/blink/renderer/core/timing/performance.h b/third_party/blink/renderer/core/timing/performance.h
index 9126b86b..114c339 100644
--- a/third_party/blink/renderer/core/timing/performance.h
+++ b/third_party/blink/renderer/core/timing/performance.h
@@ -115,7 +115,7 @@
 
   PerformanceEntryVector getEntries();
   PerformanceEntryVector getEntriesByType(const AtomicString& entry_type);
-  PerformanceEntryVector getEntriesByName(const String& name,
+  PerformanceEntryVector getEntriesByName(const AtomicString& name,
                                           const AtomicString& entry_type);
 
   void clearResourceTimings();
@@ -126,7 +126,7 @@
   void AddLongTaskTiming(
       TimeTicks start_time,
       TimeTicks end_time,
-      const String& name,
+      const AtomicString& name,
       const String& culprit_frame_src,
       const String& culprit_frame_id,
       const String& culprit_frame_name,
@@ -161,34 +161,36 @@
   void setEventTimingBufferMaxSize(unsigned);
   DEFINE_ATTRIBUTE_EVENT_LISTENER(eventtimingbufferfull);
 
-  PerformanceMark* mark(ScriptState*, const String& mark_name, ExceptionState&);
+  PerformanceMark* mark(ScriptState*,
+                        const AtomicString& mark_name,
+                        ExceptionState&);
 
   PerformanceMark* mark(
       ScriptState*,
-      const String& mark_name,
+      const AtomicString& mark_name,
       DoubleOrPerformanceMarkOptions& start_time_or_mark_options,
       ExceptionState&);
 
-  void clearMarks(const String& mark_name);
+  void clearMarks(const AtomicString& mark_name);
 
   PerformanceMeasure* measure(ScriptState*,
-                              const String& measure_name,
+                              const AtomicString& measure_name,
                               ExceptionState&);
 
   PerformanceMeasure* measure(
       ScriptState*,
-      const String& measure_name,
+      const AtomicString& measure_name,
       const StringOrDoubleOrPerformanceMeasureOptions& start_or_options,
       ExceptionState&);
 
   PerformanceMeasure* measure(
       ScriptState*,
-      const String& measure_name,
+      const AtomicString& measure_name,
       const StringOrDoubleOrPerformanceMeasureOptions& start_or_options,
       const StringOrDouble& end,
       ExceptionState&);
 
-  void clearMeasures(const String& measure_name);
+  void clearMeasures(const AtomicString& measure_name);
 
   void UnregisterPerformanceObserver(PerformanceObserver&);
   void RegisterPerformanceObserver(PerformanceObserver&);
@@ -215,14 +217,14 @@
 
   PerformanceMeasure* measureInternal(
       ScriptState*,
-      const String& measure_name,
+      const AtomicString& measure_name,
       const StringOrDoubleOrPerformanceMeasureOptions& start,
       const StringOrDouble& end,
       bool end_is_empty,
       ExceptionState&);
 
   PerformanceMeasure* measureInternal(ScriptState*,
-                                      const String& measure_name,
+                                      const AtomicString& measure_name,
                                       const StringOrDouble& start,
                                       const StringOrDouble& end,
                                       const ScriptValue& detail,
diff --git a/third_party/blink/renderer/core/timing/performance_entry.cc b/third_party/blink/renderer/core/timing/performance_entry.cc
index 2ad3ed8..bbc0f24 100644
--- a/third_party/blink/renderer/core/timing/performance_entry.cc
+++ b/third_party/blink/renderer/core/timing/performance_entry.cc
@@ -40,7 +40,7 @@
 static base::AtomicSequenceNumber index_seq;
 }
 
-PerformanceEntry::PerformanceEntry(const String& name,
+PerformanceEntry::PerformanceEntry(const AtomicString& name,
                                    double start_time,
                                    double finish_time)
     : duration_(finish_time - start_time),
@@ -50,10 +50,6 @@
 
 PerformanceEntry::~PerformanceEntry() = default;
 
-String PerformanceEntry::name() const {
-  return name_;
-}
-
 DOMHighResTimeStamp PerformanceEntry::startTime() const {
   return start_time_;
 }
diff --git a/third_party/blink/renderer/core/timing/performance_entry.h b/third_party/blink/renderer/core/timing/performance_entry.h
index 286b860..df7692f8 100644
--- a/third_party/blink/renderer/core/timing/performance_entry.h
+++ b/third_party/blink/renderer/core/timing/performance_entry.h
@@ -68,7 +68,7 @@
     kFirstInput = 1 << 10,
   };
 
-  String name() const;
+  const AtomicString& name() const { return name_; }
   DOMHighResTimeStamp startTime() const;
   virtual AtomicString entryType() const = 0;
   virtual PerformanceEntryType EntryTypeEnum() const = 0;
@@ -108,7 +108,7 @@
       const AtomicString& entry_type);
 
  protected:
-  PerformanceEntry(const String& name,
+  PerformanceEntry(const AtomicString& name,
                    double start_time,
                    double finish_time);
   virtual void BuildJSONValue(V8ObjectBuilder&) const;
@@ -117,7 +117,7 @@
   double duration_;
 
  private:
-  const String name_;
+  const AtomicString name_;
   const double start_time_;
   const int index_;
 };
diff --git a/third_party/blink/renderer/core/timing/performance_event_timing.cc b/third_party/blink/renderer/core/timing/performance_event_timing.cc
index 5fe4adc..22280a99f 100644
--- a/third_party/blink/renderer/core/timing/performance_event_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_event_timing.cc
@@ -10,7 +10,7 @@
 
 // static
 PerformanceEventTiming* PerformanceEventTiming::Create(
-    const String& event_type,
+    const AtomicString& event_type,
     DOMHighResTimeStamp start_time,
     DOMHighResTimeStamp processing_start,
     DOMHighResTimeStamp processing_end,
@@ -34,7 +34,7 @@
 }
 
 PerformanceEventTiming::PerformanceEventTiming(
-    const String& event_type,
+    const AtomicString& event_type,
     const AtomicString& entry_type,
     DOMHighResTimeStamp start_time,
     DOMHighResTimeStamp processing_start,
diff --git a/third_party/blink/renderer/core/timing/performance_event_timing.h b/third_party/blink/renderer/core/timing/performance_event_timing.h
index 3337b23..5adb319 100644
--- a/third_party/blink/renderer/core/timing/performance_event_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_event_timing.h
@@ -16,7 +16,7 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static PerformanceEventTiming* Create(const String& event_type,
+  static PerformanceEventTiming* Create(const AtomicString& event_type,
                                         DOMHighResTimeStamp start_time,
                                         DOMHighResTimeStamp processing_start,
                                         DOMHighResTimeStamp processing_end,
@@ -42,7 +42,7 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  PerformanceEventTiming(const String& event_type,
+  PerformanceEventTiming(const AtomicString& event_type,
                          const AtomicString& entry_type,
                          DOMHighResTimeStamp start_time,
                          DOMHighResTimeStamp processing_start,
diff --git a/third_party/blink/renderer/core/timing/performance_long_task_timing.cc b/third_party/blink/renderer/core/timing/performance_long_task_timing.cc
index ba90d25..74005cd 100644
--- a/third_party/blink/renderer/core/timing/performance_long_task_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_long_task_timing.cc
@@ -16,10 +16,10 @@
 PerformanceLongTaskTiming* PerformanceLongTaskTiming::Create(
     double start_time,
     double end_time,
-    String name,
-    String frame_src,
-    String frame_id,
-    String frame_name,
+    const AtomicString& name,
+    const String& frame_src,
+    const String& frame_id,
+    const String& frame_name,
     const SubTaskAttribution::EntriesVector& sub_task_attributions) {
   return new PerformanceLongTaskTiming(start_time, end_time, name, frame_src,
                                        frame_id, frame_name,
@@ -29,10 +29,10 @@
 PerformanceLongTaskTiming::PerformanceLongTaskTiming(
     double start_time,
     double end_time,
-    String name,
-    String culprit_frame_src,
-    String culprit_frame_id,
-    String culprit_frame_name,
+    const AtomicString& name,
+    const String& culprit_frame_src,
+    const String& culprit_frame_id,
+    const String& culprit_frame_name,
     const SubTaskAttribution::EntriesVector& sub_task_attributions)
     : PerformanceEntry(name, start_time, end_time) {
   // Only one possible container type exists currently: "iframe".
diff --git a/third_party/blink/renderer/core/timing/performance_long_task_timing.h b/third_party/blink/renderer/core/timing/performance_long_task_timing.h
index cb9fd59..7d77508 100644
--- a/third_party/blink/renderer/core/timing/performance_long_task_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_long_task_timing.h
@@ -23,10 +23,10 @@
   static PerformanceLongTaskTiming* Create(
       double start_time,
       double end_time,
-      String name,
-      String frame_src,
-      String frame_id,
-      String frame_name,
+      const AtomicString& name,
+      const String& frame_src,
+      const String& frame_id,
+      const String& frame_name,
       const SubTaskAttribution::EntriesVector& sub_task_attributions);
 
   AtomicString entryType() const override;
@@ -40,10 +40,10 @@
   PerformanceLongTaskTiming(
       double start_time,
       double end_time,
-      String name,
-      String frame_src,
-      String frame_id,
-      String frame_name,
+      const AtomicString& name,
+      const String& frame_src,
+      const String& frame_id,
+      const String& frame_name,
       const SubTaskAttribution::EntriesVector& sub_task_attributions);
   ~PerformanceLongTaskTiming() override;
 
diff --git a/third_party/blink/renderer/core/timing/performance_mark.cc b/third_party/blink/renderer/core/timing/performance_mark.cc
index 8c5d0b6..bef258b 100644
--- a/third_party/blink/renderer/core/timing/performance_mark.cc
+++ b/third_party/blink/renderer/core/timing/performance_mark.cc
@@ -10,7 +10,7 @@
 namespace blink {
 
 PerformanceMark::PerformanceMark(ScriptState* script_state,
-                                 const String& name,
+                                 const AtomicString& name,
                                  double start_time,
                                  const ScriptValue& detail)
     : PerformanceEntry(name, start_time, start_time) {
diff --git a/third_party/blink/renderer/core/timing/performance_mark.h b/third_party/blink/renderer/core/timing/performance_mark.h
index 9af17a7..fdd362f3 100644
--- a/third_party/blink/renderer/core/timing/performance_mark.h
+++ b/third_party/blink/renderer/core/timing/performance_mark.h
@@ -38,7 +38,7 @@
 
  public:
   static PerformanceMark* Create(ScriptState* script_state,
-                                 const String& name,
+                                 const AtomicString& name,
                                  double start_time,
                                  const ScriptValue& detail) {
     return new PerformanceMark(script_state, name, start_time, detail);
@@ -53,7 +53,7 @@
 
  private:
   PerformanceMark(ScriptState*,
-                  const String& name,
+                  const AtomicString& name,
                   double start_time,
                   const ScriptValue& detail);
 
diff --git a/third_party/blink/renderer/core/timing/performance_measure.cc b/third_party/blink/renderer/core/timing/performance_measure.cc
index ab06293a7..6be0e4f 100644
--- a/third_party/blink/renderer/core/timing/performance_measure.cc
+++ b/third_party/blink/renderer/core/timing/performance_measure.cc
@@ -10,7 +10,7 @@
 namespace blink {
 
 PerformanceMeasure::PerformanceMeasure(ScriptState* script_state,
-                                       const String& name,
+                                       const AtomicString& name,
                                        double start_time,
                                        double end_time,
                                        const ScriptValue& detail)
diff --git a/third_party/blink/renderer/core/timing/performance_measure.h b/third_party/blink/renderer/core/timing/performance_measure.h
index 86b17ba..43ba506 100644
--- a/third_party/blink/renderer/core/timing/performance_measure.h
+++ b/third_party/blink/renderer/core/timing/performance_measure.h
@@ -39,7 +39,7 @@
 
  public:
   static PerformanceMeasure* Create(ScriptState* script_state,
-                                    const String& name,
+                                    const AtomicString& name,
                                     double start_time,
                                     double end_time,
                                     const ScriptValue& detail) {
@@ -57,7 +57,7 @@
 
  private:
   PerformanceMeasure(ScriptState*,
-                     const String& name,
+                     const AtomicString& name,
                      double start_time,
                      double end_time,
                      const ScriptValue& detail);
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
index 2685932..af1ea23 100644
--- a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
@@ -22,7 +22,8 @@
     TimeTicks time_origin,
     const WebVector<WebServerTimingInfo>& server_timing)
     : PerformanceResourceTiming(
-          info ? info->FinalResponse().Url().GetString() : "",
+          info ? AtomicString(info->FinalResponse().Url().GetString())
+               : g_empty_atom,
           time_origin,
           server_timing),
       ContextClient(frame),
diff --git a/third_party/blink/renderer/core/timing/performance_paint_timing.cc b/third_party/blink/renderer/core/timing/performance_paint_timing.cc
index 1342c50e..af02ca0f 100644
--- a/third_party/blink/renderer/core/timing/performance_paint_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_paint_timing.cc
@@ -8,6 +8,27 @@
 
 namespace blink {
 
+namespace {
+
+AtomicString FromPaintTypeToString(PerformancePaintTiming::PaintType type) {
+  DCHECK(IsMainThread());
+  switch (type) {
+    case PerformancePaintTiming::PaintType::kFirstPaint: {
+      DEFINE_STATIC_LOCAL(const AtomicString, kFirstPaint, ("first-paint"));
+      return kFirstPaint;
+    }
+    case PerformancePaintTiming::PaintType::kFirstContentfulPaint: {
+      DEFINE_STATIC_LOCAL(const AtomicString, kFirstContentfulPaint,
+                          ("first-contentful-paint"));
+      return kFirstContentfulPaint;
+    }
+  }
+  NOTREACHED();
+  return g_empty_atom;
+}
+
+}  // namespace
+
 PerformancePaintTiming::PerformancePaintTiming(PaintType type,
                                                double start_time)
     : PerformanceEntry(FromPaintTypeToString(type),
@@ -24,14 +45,4 @@
   return PerformanceEntry::EntryType::kPaint;
 }
 
-String PerformancePaintTiming::FromPaintTypeToString(PaintType type) {
-  switch (type) {
-    case PaintType::kFirstPaint:
-      return "first-paint";
-    case PaintType::kFirstContentfulPaint:
-      return "first-contentful-paint";
-  }
-  NOTREACHED();
-  return "";
-}
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/timing/performance_paint_timing.h b/third_party/blink/renderer/core/timing/performance_paint_timing.h
index c67d510..30db71c 100644
--- a/third_party/blink/renderer/core/timing/performance_paint_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_paint_timing.h
@@ -21,9 +21,8 @@
 
   AtomicString entryType() const override;
   PerformanceEntryType EntryTypeEnum() const override;
-
-  static String FromPaintTypeToString(PaintType);
 };
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_TIMING_PERFORMANCE_PAINT_TIMING_H_
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.cc b/third_party/blink/renderer/core/timing/performance_resource_timing.cc
index 385b4c1..5190a97f 100644
--- a/third_party/blink/renderer/core/timing/performance_resource_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_resource_timing.cc
@@ -76,7 +76,7 @@
 
 // This constructor is for PerformanceNavigationTiming.
 PerformanceResourceTiming::PerformanceResourceTiming(
-    const String& name,
+    const AtomicString& name,
     TimeTicks time_origin,
     const WebVector<WebServerTimingInfo>& server_timing)
     : PerformanceEntry(name, 0.0, 0.0),
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.h b/third_party/blink/renderer/core/timing/performance_resource_timing.h
index 5c8d447..2235b7ec 100644
--- a/third_party/blink/renderer/core/timing/performance_resource_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_resource_timing.h
@@ -87,7 +87,7 @@
 
   // This constructor is for PerformanceNavigationTiming.
   // Related doc: https://goo.gl/uNecAj.
-  PerformanceResourceTiming(const String& name,
+  PerformanceResourceTiming(const AtomicString& name,
                             TimeTicks time_origin,
                             const WebVector<WebServerTimingInfo>&);
   virtual AtomicString AlpnNegotiatedProtocol() const;
diff --git a/third_party/blink/renderer/core/timing/performance_user_timing.cc b/third_party/blink/renderer/core/timing/performance_user_timing.cc
index 50db0c4..595cb53 100644
--- a/third_party/blink/renderer/core/timing/performance_user_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_user_timing.cc
@@ -38,37 +38,38 @@
 
 namespace {
 
-using RestrictedKeyMap = HashMap<String, NavigationTimingFunction>;
+using RestrictedKeyMap = HashMap<AtomicString, NavigationTimingFunction>;
 
 const RestrictedKeyMap& GetRestrictedKeyMap() {
-  DEFINE_THREAD_SAFE_STATIC_LOCAL(
-      RestrictedKeyMap, map,
-      ({
-          {"navigationStart", &PerformanceTiming::navigationStart},
-          {"unloadEventStart", &PerformanceTiming::unloadEventStart},
-          {"unloadEventEnd", &PerformanceTiming::unloadEventEnd},
-          {"redirectStart", &PerformanceTiming::redirectStart},
-          {"redirectEnd", &PerformanceTiming::redirectEnd},
-          {"fetchStart", &PerformanceTiming::fetchStart},
-          {"domainLookupStart", &PerformanceTiming::domainLookupStart},
-          {"domainLookupEnd", &PerformanceTiming::domainLookupEnd},
-          {"connectStart", &PerformanceTiming::connectStart},
-          {"connectEnd", &PerformanceTiming::connectEnd},
-          {"secureConnectionStart", &PerformanceTiming::secureConnectionStart},
-          {"requestStart", &PerformanceTiming::requestStart},
-          {"responseStart", &PerformanceTiming::responseStart},
-          {"responseEnd", &PerformanceTiming::responseEnd},
-          {"domLoading", &PerformanceTiming::domLoading},
-          {"domInteractive", &PerformanceTiming::domInteractive},
-          {"domContentLoadedEventStart",
-           &PerformanceTiming::domContentLoadedEventStart},
-          {"domContentLoadedEventEnd",
-           &PerformanceTiming::domContentLoadedEventEnd},
-          {"domComplete", &PerformanceTiming::domComplete},
-          {"loadEventStart", &PerformanceTiming::loadEventStart},
-          {"loadEventEnd", &PerformanceTiming::loadEventEnd},
-      }));
-  return map;
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<RestrictedKeyMap>, map, ());
+  if (!map.IsSet()) {
+    *map = {
+        {"navigationStart", &PerformanceTiming::navigationStart},
+        {"unloadEventStart", &PerformanceTiming::unloadEventStart},
+        {"unloadEventEnd", &PerformanceTiming::unloadEventEnd},
+        {"redirectStart", &PerformanceTiming::redirectStart},
+        {"redirectEnd", &PerformanceTiming::redirectEnd},
+        {"fetchStart", &PerformanceTiming::fetchStart},
+        {"domainLookupStart", &PerformanceTiming::domainLookupStart},
+        {"domainLookupEnd", &PerformanceTiming::domainLookupEnd},
+        {"connectStart", &PerformanceTiming::connectStart},
+        {"connectEnd", &PerformanceTiming::connectEnd},
+        {"secureConnectionStart", &PerformanceTiming::secureConnectionStart},
+        {"requestStart", &PerformanceTiming::requestStart},
+        {"responseStart", &PerformanceTiming::responseStart},
+        {"responseEnd", &PerformanceTiming::responseEnd},
+        {"domLoading", &PerformanceTiming::domLoading},
+        {"domInteractive", &PerformanceTiming::domInteractive},
+        {"domContentLoadedEventStart",
+         &PerformanceTiming::domContentLoadedEventStart},
+        {"domContentLoadedEventEnd",
+         &PerformanceTiming::domContentLoadedEventEnd},
+        {"domComplete", &PerformanceTiming::domComplete},
+        {"loadEventStart", &PerformanceTiming::loadEventStart},
+        {"loadEventEnd", &PerformanceTiming::loadEventEnd},
+    };
+  }
+  return *map;
 }
 
 }  // namespace
@@ -88,7 +89,7 @@
 }
 
 static void ClearPeformanceEntries(PerformanceEntryMap& performance_entry_map,
-                                   const String& name) {
+                                   const AtomicString& name) {
   if (name.IsNull()) {
     performance_entry_map.clear();
     return;
@@ -99,7 +100,7 @@
 }
 
 PerformanceMark* UserTiming::Mark(ScriptState* script_state,
-                                  const String& mark_name,
+                                  const AtomicString& mark_name,
                                   const DOMHighResTimeStamp& start_time,
                                   const ScriptValue& detail,
                                   ExceptionState& exception_state) {
@@ -123,11 +124,11 @@
   return mark;
 }
 
-void UserTiming::ClearMarks(const String& mark_name) {
+void UserTiming::ClearMarks(const AtomicString& mark_name) {
   ClearPeformanceEntries(marks_map_, mark_name);
 }
 
-double UserTiming::FindExistingMarkStartTime(const String& mark_name,
+double UserTiming::FindExistingMarkStartTime(const AtomicString& mark_name,
                                              ExceptionState& exception_state) {
   if (marks_map_.Contains(mark_name))
     return marks_map_.at(mark_name).back()->startTime();
@@ -155,8 +156,10 @@
 
 double UserTiming::FindStartMarkOrTime(const StringOrDouble& start,
                                        ExceptionState& exception_state) {
-  if (start.IsString())
-    return FindExistingMarkStartTime(start.GetAsString(), exception_state);
+  if (start.IsString()) {
+    return FindExistingMarkStartTime(AtomicString(start.GetAsString()),
+                                     exception_state);
+  }
   if (start.IsDouble())
     return start.GetAsDouble();
   NOTREACHED();
@@ -164,7 +167,7 @@
 }
 
 PerformanceMeasure* UserTiming::Measure(ScriptState* script_state,
-                                        const String& measure_name,
+                                        const AtomicString& measure_name,
                                         const StringOrDouble& start,
                                         const StringOrDouble& end,
                                         const ScriptValue& detail,
@@ -216,7 +219,7 @@
   return measure;
 }
 
-void UserTiming::ClearMeasures(const String& measure_name) {
+void UserTiming::ClearMeasures(const AtomicString& measure_name) {
   ClearPeformanceEntries(measures_map_, measure_name);
 }
 
@@ -232,7 +235,7 @@
 
 static PerformanceEntryVector GetEntrySequenceByName(
     const PerformanceEntryMap& performance_entry_map,
-    const String& name) {
+    const AtomicString& name) {
   PerformanceEntryVector entries;
 
   PerformanceEntryMap::const_iterator it = performance_entry_map.find(name);
@@ -246,7 +249,7 @@
   return ConvertToEntrySequence(marks_map_);
 }
 
-PerformanceEntryVector UserTiming::GetMarks(const String& name) const {
+PerformanceEntryVector UserTiming::GetMarks(const AtomicString& name) const {
   return GetEntrySequenceByName(marks_map_, name);
 }
 
@@ -254,7 +257,7 @@
   return ConvertToEntrySequence(measures_map_);
 }
 
-PerformanceEntryVector UserTiming::GetMeasures(const String& name) const {
+PerformanceEntryVector UserTiming::GetMeasures(const AtomicString& name) const {
   return GetEntrySequenceByName(measures_map_, name);
 }
 
diff --git a/third_party/blink/renderer/core/timing/performance_user_timing.h b/third_party/blink/renderer/core/timing/performance_user_timing.h
index 829da54..a824355d 100644
--- a/third_party/blink/renderer/core/timing/performance_user_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_user_timing.h
@@ -39,7 +39,7 @@
 
 typedef unsigned long long (
     PerformanceTiming::*NavigationTimingFunction)() const;
-using PerformanceEntryMap = HeapHashMap<String, PerformanceEntryVector>;
+using PerformanceEntryMap = HeapHashMap<AtomicString, PerformanceEntryVector>;
 
 class UserTiming final : public GarbageCollected<UserTiming> {
  public:
@@ -48,32 +48,33 @@
   }
 
   PerformanceMark* Mark(ScriptState*,
-                        const String& mark_name,
+                        const AtomicString& mark_name,
                         const DOMHighResTimeStamp& start_time,
                         const ScriptValue& detail,
                         ExceptionState&);
-  void ClearMarks(const String& mark_name);
+  void ClearMarks(const AtomicString& mark_name);
 
   PerformanceMeasure* Measure(ScriptState*,
-                              const String& measure_name,
+                              const AtomicString& measure_name,
                               const StringOrDouble& start,
                               const StringOrDouble& end,
                               const ScriptValue& detail,
                               ExceptionState&);
-  void ClearMeasures(const String& measure_name);
+  void ClearMeasures(const AtomicString& measure_name);
 
   PerformanceEntryVector GetMarks() const;
   PerformanceEntryVector GetMeasures() const;
 
-  PerformanceEntryVector GetMarks(const String& name) const;
-  PerformanceEntryVector GetMeasures(const String& name) const;
+  PerformanceEntryVector GetMarks(const AtomicString& name) const;
+  PerformanceEntryVector GetMeasures(const AtomicString& name) const;
 
   void Trace(blink::Visitor*);
 
  private:
   explicit UserTiming(Performance&);
 
-  double FindExistingMarkStartTime(const String& mark_name, ExceptionState&);
+  double FindExistingMarkStartTime(const AtomicString& mark_name,
+                                   ExceptionState&);
   double FindStartMarkOrTime(const StringOrDouble& start, ExceptionState&);
 
   Member<Performance> performance_;
diff --git a/third_party/blink/renderer/core/timing/sub_task_attribution.cc b/third_party/blink/renderer/core/timing/sub_task_attribution.cc
index 00a872ae..e7079af 100644
--- a/third_party/blink/renderer/core/timing/sub_task_attribution.cc
+++ b/third_party/blink/renderer/core/timing/sub_task_attribution.cc
@@ -6,8 +6,8 @@
 
 namespace blink {
 
-SubTaskAttribution::SubTaskAttribution(String sub_task_name,
-                                       String script_url,
+SubTaskAttribution::SubTaskAttribution(const AtomicString& sub_task_name,
+                                       const String& script_url,
                                        TimeTicks start_time,
                                        TimeDelta duration)
     : sub_task_name_(sub_task_name),
diff --git a/third_party/blink/renderer/core/timing/sub_task_attribution.h b/third_party/blink/renderer/core/timing/sub_task_attribution.h
index eef79dc..d34b049 100644
--- a/third_party/blink/renderer/core/timing/sub_task_attribution.h
+++ b/third_party/blink/renderer/core/timing/sub_task_attribution.h
@@ -18,18 +18,19 @@
  public:
   using EntriesVector = Vector<std::unique_ptr<SubTaskAttribution>>;
 
-  static std::unique_ptr<SubTaskAttribution> Create(String sub_task_name,
-                                                    String script_url,
-                                                    TimeTicks start_time,
-                                                    TimeDelta duration) {
+  static std::unique_ptr<SubTaskAttribution> Create(
+      const AtomicString& sub_task_name,
+      const String& script_url,
+      TimeTicks start_time,
+      TimeDelta duration) {
     return std::make_unique<SubTaskAttribution>(sub_task_name, script_url,
                                                 start_time, duration);
   }
-  SubTaskAttribution(String sub_task_name,
-                     String script_url,
+  SubTaskAttribution(const AtomicString& sub_task_name,
+                     const String& script_url,
                      TimeTicks start_time,
                      TimeDelta duration);
-  inline String subTaskName() const { return sub_task_name_; }
+  inline AtomicString subTaskName() const { return sub_task_name_; }
   inline String scriptURL() const { return script_url_; }
   inline TimeTicks startTime() const { return start_time_; }
   inline TimeDelta duration() const { return duration_; }
@@ -48,7 +49,7 @@
   }
 
  private:
-  String sub_task_name_;
+  AtomicString sub_task_name_;
   String script_url_;
   TimeTicks start_time_;
   TimeDelta duration_;
diff --git a/third_party/blink/renderer/core/timing/task_attribution_timing.cc b/third_party/blink/renderer/core/timing/task_attribution_timing.cc
index 1308fd6..3aeac78 100644
--- a/third_party/blink/renderer/core/timing/task_attribution_timing.cc
+++ b/third_party/blink/renderer/core/timing/task_attribution_timing.cc
@@ -9,14 +9,14 @@
 
 namespace blink {
 
-TaskAttributionTiming::TaskAttributionTiming(String name,
-                                             String container_type,
-                                             String container_src,
-                                             String container_id,
-                                             String container_name,
+TaskAttributionTiming::TaskAttributionTiming(const AtomicString& name,
+                                             const String& container_type,
+                                             const String& container_src,
+                                             const String& container_id,
+                                             const String& container_name,
                                              double start_time,
                                              double finish_time,
-                                             String script_url)
+                                             const String& script_url)
     : PerformanceEntry(name, start_time, finish_time),
       container_type_(container_type),
       container_src_(container_src),
diff --git a/third_party/blink/renderer/core/timing/task_attribution_timing.h b/third_party/blink/renderer/core/timing/task_attribution_timing.h
index 875a306d..835fdf7 100644
--- a/third_party/blink/renderer/core/timing/task_attribution_timing.h
+++ b/third_party/blink/renderer/core/timing/task_attribution_timing.h
@@ -17,25 +17,25 @@
 
  public:
   // Used when the LongTaskV2 flag is enabled.
-  static TaskAttributionTiming* Create(String type,
-                                       String container_type,
-                                       String container_src,
-                                       String container_id,
-                                       String container_name,
+  static TaskAttributionTiming* Create(const AtomicString& type,
+                                       const String& container_type,
+                                       const String& container_src,
+                                       const String& container_id,
+                                       const String& container_name,
                                        double start_time,
                                        double finish_time,
-                                       String script_url) {
+                                       const String& script_url) {
     return new TaskAttributionTiming(type, container_type, container_src,
                                      container_id, container_name, start_time,
                                      finish_time, script_url);
   }
 
   // Used when the LongTaskV2 flag is disabled.
-  static TaskAttributionTiming* Create(String type,
-                                       String container_type,
-                                       String container_src,
-                                       String container_id,
-                                       String container_name) {
+  static TaskAttributionTiming* Create(const AtomicString& type,
+                                       const String& container_type,
+                                       const String& container_src,
+                                       const String& container_id,
+                                       const String& container_name) {
     return new TaskAttributionTiming(type, container_type, container_src,
                                      container_id, container_name, 0.0, 0.0,
                                      g_empty_string);
@@ -55,14 +55,14 @@
   ~TaskAttributionTiming() override;
 
  private:
-  TaskAttributionTiming(String type,
-                        String container_type,
-                        String container_src,
-                        String container_id,
-                        String container_name,
+  TaskAttributionTiming(const AtomicString& type,
+                        const String& container_type,
+                        const String& container_src,
+                        const String& container_id,
+                        const String& container_name,
                         double start_time,
                         double finish_time,
-                        String script_url);
+                        const String& script_url);
   void BuildJSONValue(V8ObjectBuilder&) const override;
 
   String container_type_;
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 8e24fd6..ce69b03 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -55,17 +55,6 @@
 static constexpr base::TimeDelta kLongTaskObserverThreshold =
     base::TimeDelta::FromMilliseconds(50);
 
-static const char kUnknownAttribution[] = "unknown";
-static const char kAmbiguousAttribution[] = "multiple-contexts";
-static const char kSameOriginAttribution[] = "same-origin";
-static const char kSameOriginSelfAttribution[] = "self";
-static const char kSameOriginAncestorAttribution[] = "same-origin-ancestor";
-static const char kSameOriginDescendantAttribution[] = "same-origin-descendant";
-static const char kCrossOriginAncestorAttribution[] = "cross-origin-ancestor";
-static const char kCrossOriginDescendantAttribution[] =
-    "cross-origin-descendant";
-static const char kCrossOriginAttribution[] = "cross-origin-unreachable";
-
 namespace blink {
 
 namespace {
@@ -87,21 +76,45 @@
   return attr_value;
 }
 
-const char* SameOriginAttribution(Frame* observer_frame, Frame* culprit_frame) {
-  if (observer_frame == culprit_frame)
-    return kSameOriginSelfAttribution;
-  if (observer_frame->Tree().IsDescendantOf(culprit_frame))
-    return kSameOriginAncestorAttribution;
-  if (culprit_frame->Tree().IsDescendantOf(observer_frame))
-    return kSameOriginDescendantAttribution;
+const AtomicString& SelfKeyword() {
+  DEFINE_STATIC_LOCAL(const AtomicString, kSelfAttribution, ("self"));
+  return kSelfAttribution;
+}
+
+const AtomicString& SameOriginAncestorKeyword() {
+  DEFINE_STATIC_LOCAL(const AtomicString, kSameOriginAncestorAttribution,
+                      ("same-origin-ancestor"));
+  return kSameOriginAncestorAttribution;
+}
+
+const AtomicString& SameOriginDescendantKeyword() {
+  DEFINE_STATIC_LOCAL(const AtomicString, kSameOriginDescendantAttribution,
+                      ("same-origin-descendant"));
+  return kSameOriginDescendantAttribution;
+}
+
+const AtomicString& SameOriginKeyword() {
+  DEFINE_STATIC_LOCAL(const AtomicString, kSameOriginAttribution,
+                      ("same-origin"));
   return kSameOriginAttribution;
 }
 
-bool IsSameOrigin(String key) {
-  return key == kSameOriginAttribution ||
-         key == kSameOriginDescendantAttribution ||
-         key == kSameOriginAncestorAttribution ||
-         key == kSameOriginSelfAttribution;
+AtomicString SameOriginAttribution(Frame* observer_frame,
+                                   Frame* culprit_frame) {
+  DCHECK(IsMainThread());
+  if (observer_frame == culprit_frame)
+    return SelfKeyword();
+  if (observer_frame->Tree().IsDescendantOf(culprit_frame))
+    return SameOriginAncestorKeyword();
+  if (culprit_frame->Tree().IsDescendantOf(observer_frame))
+    return SameOriginDescendantKeyword();
+  return SameOriginKeyword();
+}
+
+bool IsSameOrigin(const AtomicString& key) {
+  DCHECK(IsMainThread());
+  return key == SameOriginKeyword() || key == SameOriginDescendantKeyword() ||
+         key == SameOriginAncestorKeyword() || key == SelfKeyword();
 }
 
 }  // namespace
@@ -228,18 +241,22 @@
  * See detailed Security doc here: http://bit.ly/2duD3F7
  */
 // static
-std::pair<String, DOMWindow*> WindowPerformance::SanitizedAttribution(
+std::pair<AtomicString, DOMWindow*> WindowPerformance::SanitizedAttribution(
     ExecutionContext* task_context,
     bool has_multiple_contexts,
     LocalFrame* observer_frame) {
+  DCHECK(IsMainThread());
   if (has_multiple_contexts) {
     // Unable to attribute, multiple script execution contents were involved.
+    DEFINE_STATIC_LOCAL(const AtomicString, kAmbiguousAttribution,
+                        ("multiple-contexts"));
     return std::make_pair(kAmbiguousAttribution, nullptr);
   }
 
   if (!task_context || !task_context->IsDocument() ||
       !ToDocument(task_context)->GetFrame()) {
     // Unable to attribute as no script was involved.
+    DEFINE_STATIC_LOCAL(const AtomicString, kUnknownAttribution, ("unknown"));
     return std::make_pair(kUnknownAttribution, nullptr);
   }
 
@@ -266,12 +283,18 @@
         last_cross_origin_frame = frame;
       }
     }
+    DEFINE_STATIC_LOCAL(const AtomicString, kCrossOriginDescendantAttribution,
+                        ("cross-origin-descendant"));
     return std::make_pair(kCrossOriginDescendantAttribution,
                           last_cross_origin_frame->DomWindow());
   }
   if (observer_frame->Tree().IsDescendantOf(culprit_frame)) {
+    DEFINE_STATIC_LOCAL(const AtomicString, kCrossOriginAncestorAttribution,
+                        ("cross-origin-ancestor"));
     return std::make_pair(kCrossOriginAncestorAttribution, nullptr);
   }
+  DEFINE_STATIC_LOCAL(const AtomicString, kCrossOriginAttribution,
+                      ("cross-origin-unreachable"));
   return std::make_pair(kCrossOriginAttribution, nullptr);
 }
 
@@ -283,7 +306,7 @@
     const SubTaskAttribution::EntriesVector& sub_task_attributions) {
   if (!GetFrame())
     return;
-  std::pair<String, DOMWindow*> attribution =
+  std::pair<AtomicString, DOMWindow*> attribution =
       WindowPerformance::SanitizedAttribution(
           task_context, has_multiple_contexts, GetFrame());
   DOMWindow* culprit_dom_window = attribution.second;
@@ -316,7 +339,7 @@
   return HasObserverFor(PerformanceEntry::kEvent);
 }
 
-void WindowPerformance::RegisterEventTiming(String event_type,
+void WindowPerformance::RegisterEventTiming(const AtomicString& event_type,
                                             TimeTicks start_time,
                                             TimeTicks processing_start,
                                             TimeTicks processing_end,
diff --git a/third_party/blink/renderer/core/timing/window_performance.h b/third_party/blink/renderer/core/timing/window_performance.h
index 6cb0beb..736343a2a 100644
--- a/third_party/blink/renderer/core/timing/window_performance.h
+++ b/third_party/blink/renderer/core/timing/window_performance.h
@@ -73,7 +73,7 @@
   // This method creates a PerformanceEventTiming and if needed creates a swap
   // promise to calculate the |duration| attribute when such promise is
   // resolved.
-  void RegisterEventTiming(String event_type,
+  void RegisterEventTiming(const AtomicString& event_type,
                            TimeTicks start_time,
                            TimeTicks processing_start,
                            TimeTicks processing_end,
@@ -86,7 +86,7 @@
 
   PerformanceNavigationTiming* CreateNavigationTimingInstance() override;
 
-  static std::pair<String, DOMWindow*> SanitizedAttribution(
+  static std::pair<AtomicString, DOMWindow*> SanitizedAttribution(
       ExecutionContext*,
       bool has_multiple_contexts,
       LocalFrame* observer_frame);
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc
index 181b469..6e014a0b 100644
--- a/third_party/blink/renderer/core/timing/window_performance_test.cc
+++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -198,22 +198,22 @@
   DummyExceptionStateForTesting exception_state;
   clock.Advance(TimeDelta::FromSeconds(2));
   for (int i = 0; i < 8; i++) {
-    performance_->mark(scope.GetScriptState(), String::Number(i),
+    performance_->mark(scope.GetScriptState(), AtomicString::Number(i),
                        exception_state);
   }
   clock.Advance(TimeDelta::FromSeconds(2));
   for (int i = 8; i < 17; i++) {
-    performance_->mark(scope.GetScriptState(), String::Number(i),
+    performance_->mark(scope.GetScriptState(), AtomicString::Number(i),
                        exception_state);
   }
   PerformanceEntryVector entries = performance_->getEntries();
   EXPECT_EQ(17U, entries.size());
   for (int i = 0; i < 8; i++) {
-    EXPECT_EQ(String::Number(i), entries[i]->name());
+    EXPECT_EQ(AtomicString::Number(i), entries[i]->name());
     EXPECT_NEAR(2000, entries[i]->startTime(), 0.005);
   }
   for (int i = 8; i < 17; i++) {
-    EXPECT_EQ(String::Number(i), entries[i]->name());
+    EXPECT_EQ(AtomicString::Number(i), entries[i]->name());
     EXPECT_NEAR(4000, entries[i]->startTime(), 0.005);
   }
 }
@@ -305,7 +305,7 @@
 // Test for existence of 'firstInput' given different types of first events.
 TEST_F(WindowPerformanceTest, FirstInput) {
   struct {
-    String event_type;
+    AtomicString event_type;
     bool should_report;
   } inputs[] = {{"click", true},     {"keydown", true},
                 {"keypress", false}, {"pointerdown", false},
@@ -329,7 +329,7 @@
 // Test that the 'firstInput' is populated after some irrelevant events are
 // ignored.
 TEST_F(WindowPerformanceTest, FirstInputAfterIgnored) {
-  String several_events[] = {"mousemove", "mouseover", "mousedown"};
+  AtomicString several_events[] = {"mousemove", "mouseover", "mousedown"};
   for (const auto& event : several_events) {
     performance_->RegisterEventTiming(
         event, GetTimeOrigin(),
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
index 7203e78..8df76df 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_utils.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_uuid.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 #include <memory>
 #include <utility>
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc
index dc208ba..e371e82 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_error.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_uuid.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
index e9d81621..e76a6b3 100644
--- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -25,6 +25,7 @@
 #include "third_party/blink/renderer/modules/mediastream/media_track_constraints.h"
 #include "third_party/blink/renderer/platform/mojo/mojo_helper.h"
 #include "third_party/blink/renderer/platform/waitable_event.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
index 49cdcc0..94d677f 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
@@ -53,6 +53,7 @@
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 using blink::WebIDBCursor;
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc b/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
index 68b3d5d5..5e2930db 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 #include <memory>
 
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc b/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
index c4d58193..ab964f1 100644
--- a/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
+++ b/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc b/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc
index 31cf26cbb..a7db4ba 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc
@@ -1860,106 +1860,6 @@
   return index;
 }
 
-std::tuple<bool, size_t> AudioParamTimeline::EventAtFrame(
-    size_t current_frame,
-    float sample_rate) const {
-
-  size_t number_of_events = events_.size();
-  ParamEvent* event = nullptr;
-  ParamEvent* next_event = nullptr;
-  size_t current_event_index = 0;
-
-  for (current_event_index = 0; current_event_index < number_of_events;
-       ++current_event_index) {
-    event = events_[current_event_index].get();
-    next_event = current_event_index < number_of_events - 1
-                     ? events_[current_event_index + 1].get()
-                     : nullptr;
-
-    // Exit when we find a current event
-    if (IsEventCurrent(event, next_event, current_frame, sample_rate)) {
-      break;
-    }
-  }
-
-  // No current event, so no conflict.
-  if (current_event_index >= number_of_events) {
-    return std::make_tuple(false, 0);
-  }
-
-  double current_time = current_frame / sample_rate;
-
-  // Determine if setting the value at this time would overlap some
-  // event.
-  if (next_event) {
-    // There's a following event.  If the current event has ended
-    // and the next event hasn't started, then there's no conflict.
-    ParamEvent::Type next_type = next_event->GetType();
-    switch (event->GetType()) {
-      case ParamEvent::kSetValue:
-      case ParamEvent::kLinearRampToValue:
-      case ParamEvent::kExponentialRampToValue:
-        // The current event is happening right now or is in the
-        // past and is followed by some automation that starts in
-        // the future (like SetValue, SetTarget, etc.).  Then
-        // there's no overlap. Otherwise there is.
-        if (current_time < next_event->Time() &&
-            (next_type == ParamEvent::kSetValue ||
-             next_type == ParamEvent::kSetTarget ||
-             next_type == ParamEvent::kSetValueCurve)) {
-          return std::make_tuple(false, 0);
-        }
-        return std::make_tuple(true, current_event_index);
-        break;
-      default:
-        return std::make_tuple(true, current_event_index);
-    }
-  }
-
-  // No next event.
-  switch (event->GetType()) {
-    case ParamEvent::kSetValue:
-      return std::make_tuple(false, 0);
-    case ParamEvent::kSetValueCurve:
-      if (current_time <= event->Time() + event->Duration()) {
-        return std::make_tuple(true, current_event_index);
-      }
-      break;
-    case ParamEvent::kSetTarget:
-      if (current_time >= event->Time()) {
-        return std::make_tuple(true, current_event_index);
-      }
-      break;
-    default:
-      break;
-  }
-
-  return std::make_tuple(false, 0);
-}
-
-// TODO(crbug.com/764396): Remove this when fixed.
-void AudioParamTimeline::WarnSetterOverlapsEvent(
-    String param_name,
-    size_t event_index,
-    BaseAudioContext& context) const {
-
-  DCHECK_LT(event_index, events_.size());
-
-  ParamEvent* event = events_[event_index].get();
-  size_t next_index = event_index + 1;
-  ParamEvent* next =
-      next_index < events_.size() ? events_[next_index].get() : nullptr;
-
-  String message = EventToString(*event) +
-                   (next ? " to " + EventToString(*next) : String(""));
-
-  context.GetExecutionContext()->AddConsoleMessage(
-      ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel,
-                             param_name + ".value setter called at time " +
-                                 String::Number(context.currentTime(), 16) +
-                                 " overlaps event " + message));
-}
-
 void AudioParamTimeline::RemoveCancelledEvents(size_t first_event_to_remove) {
   // For all the events that are being removed, also remove that event
   // from |new_events_|.
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param_timeline.h b/third_party/blink/renderer/modules/webaudio/audio_param_timeline.h
index a37f8b0..e0cf3cd4 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param_timeline.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_param_timeline.h
@@ -445,22 +445,6 @@
                            size_t end_frame,
                            unsigned write_index);
 
-  // TODO(crbug.com/764396): Remove these two methods when the bug is fixed.
-
-  // |EventAtFrame| finds the current event that would run at the specified
-  // |frame|. The first return value is true if a setValueAtTime call would
-  // overlap some ongoing event.  The second return value is the index of the
-  // current event. The second value must be ignored if the first value is
-  // false.
-  std::tuple<bool, size_t> EventAtFrame(size_t frame, float sample_rate) const;
-
-  // Prints a console warning that a call to the AudioParam value setter
-  // overlaps the event at |event_index|.  |param_name| is the name of the
-  // AudioParam where the where this is happening.
-  void WarnSetterOverlapsEvent(String param_name,
-                               size_t event_index,
-                               BaseAudioContext&) const;
-
   // When cancelling events, remove the items from |events_| starting
   // at the given index.  Update |new_events_| too.
   void RemoveCancelledEvents(size_t first_event_to_remove);
diff --git a/third_party/blink/renderer/platform/cross_thread_copier.cc b/third_party/blink/renderer/platform/cross_thread_copier.cc
index 240eb81..1154c8d 100644
--- a/third_party/blink/renderer/platform/cross_thread_copier.cc
+++ b/third_party/blink/renderer/platform/cross_thread_copier.cc
@@ -31,9 +31,6 @@
 #include "third_party/blink/renderer/platform/cross_thread_copier.h"
 
 #include <memory>
-#include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
-#include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
-#include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
@@ -48,21 +45,6 @@
   return str.IsolatedCopy();
 }
 
-CrossThreadCopier<ResourceError>::Type CrossThreadCopier<ResourceError>::Copy(
-    const ResourceError& error) {
-  return error.Copy();
-}
-
-CrossThreadCopier<ResourceRequest>::Type
-CrossThreadCopier<ResourceRequest>::Copy(const ResourceRequest& request) {
-  return WTF::Passed(request.CopyData());
-}
-
-CrossThreadCopier<ResourceResponse>::Type
-CrossThreadCopier<ResourceResponse>::Copy(const ResourceResponse& response) {
-  return WTF::Passed(response.CopyData());
-}
-
 // Test CrossThreadCopier using static_assert.
 
 // Verify that ThreadSafeRefCounted objects get handled correctly.
diff --git a/third_party/blink/renderer/platform/cross_thread_copier.h b/third_party/blink/renderer/platform/cross_thread_copier.h
index 1bf8a86..db80737 100644
--- a/third_party/blink/renderer/platform/cross_thread_copier.h
+++ b/third_party/blink/renderer/platform/cross_thread_copier.h
@@ -67,11 +67,6 @@
 class IntRect;
 class IntSize;
 class KURL;
-class ResourceError;
-class ResourceRequest;
-class ResourceResponse;
-struct CrossThreadResourceResponseData;
-struct CrossThreadResourceRequestData;
 template <typename T>
 class CrossThreadPersistent;
 template <typename T>
@@ -249,29 +244,6 @@
   PLATFORM_EXPORT static Type Copy(const String&);
 };
 
-template <>
-struct CrossThreadCopier<ResourceError> {
-  STATIC_ONLY(CrossThreadCopier);
-  typedef ResourceError Type;
-  PLATFORM_EXPORT static Type Copy(const ResourceError&);
-};
-
-template <>
-struct CrossThreadCopier<ResourceRequest> {
-  STATIC_ONLY(CrossThreadCopier);
-  typedef WTF::PassedWrapper<std::unique_ptr<CrossThreadResourceRequestData>>
-      Type;
-  PLATFORM_EXPORT static Type Copy(const ResourceRequest&);
-};
-
-template <>
-struct CrossThreadCopier<ResourceResponse> {
-  STATIC_ONLY(CrossThreadCopier);
-  typedef WTF::PassedWrapper<std::unique_ptr<CrossThreadResourceResponseData>>
-      Type;
-  PLATFORM_EXPORT static Type Copy(const ResourceResponse&);
-};
-
 // mojo::InterfacePtrInfo is a cross-thread safe mojo::InterfacePtr.
 template <typename Interface>
 struct CrossThreadCopier<mojo::InterfacePtrInfo<Interface>> {
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
index 0b204d5..74bad6a4 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
@@ -876,6 +876,13 @@
   float total_advance = 0.0f;
   bool has_vertical_offsets = !is_horizontal_run;
 
+#if !defined(OS_MACOSX)
+  // Allocate and populate vector for BoundsForGlyphs call in ComputeGlyphBounds
+  // here to avoid having to iterate over all glyphs an extra time.
+  Vector<Glyph> glyphs(
+      std::min(num_glyphs, HarfBuzzRunGlyphData::kMaxCharacterIndex));
+#endif
+
   // HarfBuzz returns result in visual order, no need to flip for RTL.
   for (unsigned i = 0; i < num_glyphs; ++i) {
     uint16_t glyph = glyph_infos[start_glyph + i].codepoint;
@@ -906,49 +913,67 @@
         IsSafeToBreakBefore(glyph_infos + start_glyph, num_glyphs, i));
     total_advance += advance;
     has_vertical_offsets |= (offset.Height() != 0);
+
+#if !defined(OS_MACOSX)
+    // See comment in ShapeResult::ComputeGlyphBounds.
+    glyphs[i] = run->glyph_data_[i].glyph;
+#endif
   }
 
   run->width_ = std::max(0.0f, total_advance);
   has_vertical_offsets_ |= has_vertical_offsets;
-
+#if defined(OS_MACOSX)
   ComputeGlyphBounds<is_horizontal_run>(*run);
+#else
+  ComputeGlyphBounds<is_horizontal_run>(*run, glyphs);
+#endif
 }
 
+// TODO(kojii): MacOS does not benefit from batching the Skia request due to
+// https://bugs.chromium.org/p/skia/issues/detail?id=5328 , and the cost to
+// prepare batching, which is normally much less than the benefit of batching,
+// is not ignorable unfortunately.
+#if defined(OS_MACOSX)
 template <bool is_horizontal_run>
 void ShapeResult::ComputeGlyphBounds(const ShapeResult::RunInfo& run) {
-  // Skia runs much faster if we give a list of glyph ID rather than calling it
-  // on each glyph.
   const SimpleFontData& current_font_data = *run.font_data_;
-#if defined(OS_MACOSX)
-  // TODO(kojii): MacOS does not benefit from batching the Skia request due to
-  // https://bugs.chromium.org/p/skia/issues/detail?id=5328 , and the cost to
-  // prepare batching, which is normally much less than the benefit of batching,
-  // is not ignorable unfortunately.
+
   GlyphBoundsAccumulator bounds(width_);
   for (const HarfBuzzRunGlyphData& glyph_data : run.glyph_data_) {
     bounds.Unite<is_horizontal_run>(
         glyph_data, current_font_data.BoundsForGlyph(glyph_data.glyph));
     bounds.origin += glyph_data.advance;
   }
-#else
+
+  if (!is_horizontal_run)
+    bounds.ConvertVerticalRunToLogical(current_font_data.GetFontMetrics());
+  glyph_bounding_box_.Unite(bounds.bounds);
+}
+
+#else   // !OS_MACOSX
+template <bool is_horizontal_run>
+void ShapeResult::ComputeGlyphBounds(const ShapeResult::RunInfo& run,
+                                     const Vector<Glyph>& glyphs) {
+  const SimpleFontData& current_font_data = *run.font_data_;
+
+  // Skia runs much faster if we give a list of glyph ID rather than calling it
+  // on each glyph.
   unsigned num_glyphs = run.glyph_data_.size();
-  Vector<Glyph, 256> glyphs(num_glyphs);
-  for (unsigned i = 0; i < num_glyphs; i++)
-    glyphs[i] = run.glyph_data_[i].glyph;
-  Vector<FloatRect, 256> bounds_list(num_glyphs);
+  Vector<SkRect> bounds_list(num_glyphs);
   current_font_data.BoundsForGlyphs(glyphs, &bounds_list);
 
   GlyphBoundsAccumulator bounds(width_);
   for (unsigned i = 0; i < num_glyphs; i++) {
     const HarfBuzzRunGlyphData& glyph_data = run.glyph_data_[i];
-    bounds.Unite<is_horizontal_run>(glyph_data, bounds_list[i]);
+    bounds.Unite<is_horizontal_run>(glyph_data, FloatRect(bounds_list[i]));
     bounds.origin += glyph_data.advance;
   }
-#endif
+
   if (!is_horizontal_run)
     bounds.ConvertVerticalRunToLogical(current_font_data.GetFontMetrics());
   glyph_bounding_box_.Unite(bounds.bounds);
 }
+#endif  // !OS_MACOSX
 
 void ShapeResult::InsertRun(std::unique_ptr<ShapeResult::RunInfo> run_to_insert,
                             unsigned start_glyph,
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h
index 506757d..71eca39f 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h
+++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h
@@ -32,7 +32,9 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_SHAPE_RESULT_H_
 
 #include <memory>
+#include "build/build_config.h"
 #include "third_party/blink/renderer/platform/fonts/canvas_rotation_in_vertical.h"
+#include "third_party/blink/renderer/platform/fonts/glyph.h"
 #include "third_party/blink/renderer/platform/geometry/float_rect.h"
 #include "third_party/blink/renderer/platform/layout_unit.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
@@ -321,8 +323,15 @@
                              unsigned start_glyph,
                              unsigned num_glyphs,
                              hb_buffer_t*);
+
+#if defined(OS_MACOSX)
   template <bool is_horizontal_run>
   void ComputeGlyphBounds(const ShapeResult::RunInfo&);
+#else
+  template <bool is_horizontal_run>
+  void ComputeGlyphBounds(const ShapeResult::RunInfo&, const Vector<Glyph>&);
+#endif
+
   void InsertRun(std::unique_ptr<ShapeResult::RunInfo>,
                  unsigned start_glyph,
                  unsigned num_glyphs,
diff --git a/third_party/blink/renderer/platform/fonts/simple_font_data.cc b/third_party/blink/renderer/platform/fonts/simple_font_data.cc
index 811beb0..4d1ceec 100644
--- a/third_party/blink/renderer/platform/fonts/simple_font_data.cc
+++ b/third_party/blink/renderer/platform/fonts/simple_font_data.cc
@@ -354,18 +354,14 @@
   return FloatRect(bounds);
 }
 
-void SimpleFontData::BoundsForGlyphs(const Vector<Glyph, 256> glyphs,
-                                     Vector<FloatRect, 256>* bounds) const {
+void SimpleFontData::BoundsForGlyphs(const Vector<Glyph> glyphs,
+                                     Vector<SkRect>* bounds) const {
   DCHECK_EQ(glyphs.size(), bounds->size());
 
   if (!platform_data_.size())
     return;
 
-  Vector<SkRect, 256> skia_bounds(glyphs.size());
-  SkiaTextMetrics(&paint_).GetSkiaBoundsForGlyphs(glyphs, skia_bounds.data());
-
-  for (unsigned i = 0; i < skia_bounds.size(); i++)
-    (*bounds)[i] = FloatRect(skia_bounds[i]);
+  SkiaTextMetrics(&paint_).GetSkiaBoundsForGlyphs(glyphs, bounds->data());
 }
 
 float SimpleFontData::PlatformWidthForGlyph(Glyph glyph) const {
diff --git a/third_party/blink/renderer/platform/fonts/simple_font_data.h b/third_party/blink/renderer/platform/fonts/simple_font_data.h
index cbf96463..8e14be72 100644
--- a/third_party/blink/renderer/platform/fonts/simple_font_data.h
+++ b/third_party/blink/renderer/platform/fonts/simple_font_data.h
@@ -110,7 +110,7 @@
   }
 
   FloatRect BoundsForGlyph(Glyph) const;
-  void BoundsForGlyphs(const Vector<Glyph, 256>, Vector<FloatRect, 256>*) const;
+  void BoundsForGlyphs(const Vector<Glyph>, Vector<SkRect>*) const;
   FloatRect PlatformBoundsForGlyph(Glyph) const;
   float WidthForGlyph(Glyph) const;
   float PlatformWidthForGlyph(Glyph) const;
diff --git a/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.cc b/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.cc
index ea9fdbc6..8c198b30 100644
--- a/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.cc
+++ b/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.cc
@@ -72,7 +72,7 @@
   }
 }
 
-void SkiaTextMetrics::GetSkiaBoundsForGlyphs(const Vector<Glyph, 256> glyphs,
+void SkiaTextMetrics::GetSkiaBoundsForGlyphs(const Vector<Glyph> glyphs,
                                              SkRect* bounds) {
 #if defined(OS_MACOSX)
   for (unsigned i = 0; i < glyphs.size(); i++) {
diff --git a/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.h b/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.h
index e49ccee..cad80134 100644
--- a/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.h
+++ b/third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.h
@@ -21,7 +21,7 @@
   void GetGlyphExtentsForHarfBuzz(hb_codepoint_t, hb_glyph_extents_t*);
 
   void GetSkiaBoundsForGlyph(Glyph, SkRect* bounds);
-  void GetSkiaBoundsForGlyphs(const Vector<Glyph, 256>, SkRect*);
+  void GetSkiaBoundsForGlyphs(const Vector<Glyph>, SkRect*);
   float GetSkiaWidthForGlyph(Glyph);
 
   static hb_position_t SkiaScalarToHarfBuzzPosition(SkScalar value);
diff --git a/third_party/blink/renderer/platform/image-decoders/jpeg/jpeg_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/jpeg/jpeg_image_decoder.cc
index fd4e72b..afa90d8 100644
--- a/third_party/blink/renderer/platform/image-decoders/jpeg/jpeg_image_decoder.cc
+++ b/third_party/blink/renderer/platform/image-decoders/jpeg/jpeg_image_decoder.cc
@@ -643,7 +643,10 @@
   IntSize UvSize() const { return uv_size_; }
 
  private:
-  NO_SANITIZE_CFI_ICALL JSAMPARRAY AllocateSampleArray() {
+#if defined(USE_SYSTEM_LIBJPEG)
+  NO_SANITIZE_CFI_ICALL
+#endif
+  JSAMPARRAY AllocateSampleArray() {
 // Some output color spaces don't need the sample array: don't allocate in that
 // case.
 #if defined(TURBO_JPEG_RGB_SWIZZLE)
diff --git a/third_party/blink/renderer/platform/loader/BUILD.gn b/third_party/blink/renderer/platform/loader/BUILD.gn
index 2e03074..95318a2 100644
--- a/third_party/blink/renderer/platform/loader/BUILD.gn
+++ b/third_party/blink/renderer/platform/loader/BUILD.gn
@@ -112,7 +112,6 @@
     "fetch/raw_resource_test.cc",
     "fetch/resource_fetcher_test.cc",
     "fetch/resource_load_scheduler_test.cc",
-    "fetch/resource_loader_options_test.cc",
     "fetch/resource_loader_test.cc",
     "fetch/resource_request_test.cc",
     "fetch/resource_response_test.cc",
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_initiator_info.h b/third_party/blink/renderer/platform/loader/fetch/fetch_initiator_info.h
index 8d471af..2230bcc 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_initiator_info.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_initiator_info.h
@@ -32,6 +32,7 @@
 
 namespace blink {
 
+// This class is thread-bound. Do not copy/pass an instance across threads.
 struct FetchInitiatorInfo {
   DISALLOW_NEW();
   FetchInitiatorInfo()
@@ -40,8 +41,6 @@
         start_time(0.0),
         is_link_preload(false) {}
 
-  // ATTENTION: When adding members, update CrossThreadFetchInitiatorInfoData,
-  // too.
   AtomicString name;
   TextPosition position;
   double start_time;
@@ -49,34 +48,6 @@
   String imported_module_referrer;
 };
 
-// Encode AtomicString as String to cross threads.
-struct CrossThreadFetchInitiatorInfoData {
-  DISALLOW_NEW();
-  explicit CrossThreadFetchInitiatorInfoData(const FetchInitiatorInfo& info)
-      : name(info.name.GetString().IsolatedCopy()),
-        position(info.position),
-        start_time(info.start_time),
-        is_link_preload(info.is_link_preload),
-        imported_module_referrer(info.imported_module_referrer.IsolatedCopy()) {
-  }
-
-  operator FetchInitiatorInfo() const {
-    FetchInitiatorInfo info;
-    info.name = AtomicString(name);
-    info.position = position;
-    info.start_time = start_time;
-    info.is_link_preload = is_link_preload;
-    info.imported_module_referrer = imported_module_referrer;
-    return info;
-  }
-
-  String name;
-  TextPosition position;
-  double start_time;
-  bool is_link_preload;
-  String imported_module_referrer;
-};
-
 }  // namespace blink
 
 #endif
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc
index 49c1954..fbb93fa 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc
@@ -40,17 +40,6 @@
       defer_(kNoDefer),
       placeholder_image_request_type_(kDisallowPlaceholder) {}
 
-FetchParameters::FetchParameters(
-    std::unique_ptr<CrossThreadFetchParametersData> data)
-    : resource_request_(data->resource_request.get()),
-      decoder_options_(data->decoder_options),
-      options_(data->options),
-      speculative_preload_type_(data->speculative_preload_type),
-      defer_(data->defer),
-      resource_width_(data->resource_width),
-      client_hint_preferences_(data->client_hint_preferences),
-      placeholder_image_request_type_(data->placeholder_image_request_type) {}
-
 FetchParameters::FetchParameters(const ResourceRequest& resource_request,
                                  const ResourceLoaderOptions& options)
     : resource_request_(resource_request),
@@ -147,18 +136,4 @@
   // fresh in the cache.
 }
 
-std::unique_ptr<CrossThreadFetchParametersData> FetchParameters::CopyData()
-    const {
-  auto data = std::make_unique<CrossThreadFetchParametersData>();
-  data->resource_request = resource_request_.CopyData();
-  data->decoder_options = decoder_options_;
-  data->options = CrossThreadResourceLoaderOptionsData(options_);
-  data->speculative_preload_type = speculative_preload_type_;
-  data->defer = defer_;
-  data->resource_width = resource_width_;
-  data->client_hint_preferences = client_hint_preferences_;
-  data->placeholder_image_request_type = placeholder_image_request_type_;
-  return data;
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
index 336a502..a1d0314 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
@@ -41,16 +41,12 @@
 namespace blink {
 
 class SecurityOrigin;
-struct CrossThreadFetchParametersData;
 
 // A FetchParameters is a "parameter object" for
 // ResourceFetcher::requestResource to avoid the method having too many
 // arguments.
 //
-// There are cases where we need to copy a FetchParameters across threads, and
-// CrossThreadFetchParametersData is a struct for the purpose. When you add a
-// member variable to this class, do not forget to add the corresponding
-// one in CrossThreadFetchParametersData and write copying logic.
+// This class is thread-bound. Do not copy/pass an instance across threads.
 class PLATFORM_EXPORT FetchParameters {
   DISALLOW_NEW();
 
@@ -74,7 +70,6 @@
   };
 
   explicit FetchParameters(const ResourceRequest&);
-  explicit FetchParameters(std::unique_ptr<CrossThreadFetchParametersData>);
   FetchParameters(const ResourceRequest&, const ResourceLoaderOptions&);
   ~FetchParameters();
 
@@ -186,9 +181,6 @@
   // method sets m_placeholderImageRequestType to the appropriate value.
   void SetAllowImagePlaceholder();
 
-  // Gets a copy of the data suitable for passing to another thread.
-  std::unique_ptr<CrossThreadFetchParametersData> CopyData() const;
-
  private:
   ResourceRequest resource_request_;
   // |decoder_options_|'s ContentType is set to |kPlainTextContent| in
@@ -204,43 +196,6 @@
   bool is_stale_revalidation_ = false;
 };
 
-// This class is needed to copy a FetchParameters across threads, because it
-// has some members which cannot be transferred across threads (AtomicString
-// for example).
-// There are some rules / restrictions:
-//  - This struct cannot contain an object that cannot be transferred across
-//    threads (e.g., AtomicString)
-//  - Non-simple members need explicit copying (e.g., String::IsolatedCopy,
-//    KURL::Copy) rather than the copy constructor or the assignment operator.
-struct CrossThreadFetchParametersData {
-  WTF_MAKE_NONCOPYABLE(CrossThreadFetchParametersData);
-  USING_FAST_MALLOC(CrossThreadFetchParametersData);
-
- public:
-  CrossThreadFetchParametersData()
-      : decoder_options(TextResourceDecoderOptions::kPlainTextContent),
-        options(ResourceLoaderOptions()) {}
-
-  std::unique_ptr<CrossThreadResourceRequestData> resource_request;
-  TextResourceDecoderOptions decoder_options;
-  CrossThreadResourceLoaderOptionsData options;
-  FetchParameters::SpeculativePreloadType speculative_preload_type;
-  FetchParameters::DeferOption defer;
-  FetchParameters::ResourceWidth resource_width;
-  ClientHintsPreferences client_hint_preferences;
-  FetchParameters::PlaceholderImageRequestType placeholder_image_request_type;
-};
-
-template <>
-struct CrossThreadCopier<FetchParameters> {
-  STATIC_ONLY(CrossThreadCopier);
-  using Type =
-      WTF::PassedWrapper<std::unique_ptr<CrossThreadFetchParametersData>>;
-  static Type Copy(const FetchParameters& fetch_params) {
-    return WTF::Passed(fetch_params.CopyData());
-  }
-};
-
 }  // namespace blink
 
 #endif
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h
index 3617906..2dc495b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h
@@ -33,7 +33,6 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "services/network/public/mojom/url_loader_factory.mojom-blink.h"
-#include "third_party/blink/renderer/platform/cross_thread_copier.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_info.h"
 #include "third_party/blink/renderer/platform/loader/fetch/integrity_metadata.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
@@ -75,6 +74,7 @@
   kIsCacheAwareLoadingEnabled
 };
 
+// This class is thread-bound. Do not copy/pass an instance across threads.
 struct ResourceLoaderOptions {
   USING_FAST_MALLOC(ResourceLoaderOptions);
 
@@ -91,9 +91,6 @@
 
   FetchInitiatorInfo initiator_info;
 
-  // ATTENTION: When adding members, update
-  // CrossThreadResourceLoaderOptionsData, too.
-
   DataBufferingPolicy data_buffering_policy;
 
   ContentSecurityPolicyDisposition content_security_policy_option;
@@ -122,88 +119,6 @@
       url_loader_factory;
 };
 
-// Encode AtomicString (in FetchInitiatorInfo) as String to cross threads.
-struct CrossThreadResourceLoaderOptionsData {
-  DISALLOW_NEW();
-  explicit CrossThreadResourceLoaderOptionsData(
-      const ResourceLoaderOptions& options)
-      : data_buffering_policy(options.data_buffering_policy),
-        content_security_policy_option(options.content_security_policy_option),
-        initiator_info(options.initiator_info),
-        request_initiator_context(options.request_initiator_context),
-        synchronous_policy(options.synchronous_policy),
-        cors_handling_by_resource_fetcher(
-            options.cors_handling_by_resource_fetcher),
-        cors_flag(options.cors_flag),
-        security_origin(options.security_origin
-                            ? options.security_origin->IsolatedCopy()
-                            : nullptr),
-        content_security_policy_nonce(
-            options.content_security_policy_nonce.IsolatedCopy()),
-        integrity_metadata(options.integrity_metadata),
-        parser_disposition(options.parser_disposition),
-        cache_aware_loading_enabled(options.cache_aware_loading_enabled) {
-    if (options.url_loader_factory) {
-      DCHECK(options.url_loader_factory->data.is_bound());
-      url_loader_factory = base::MakeRefCounted<base::RefCountedData<
-          network::mojom::blink::URLLoaderFactoryPtrInfo>>();
-      options.url_loader_factory->data->Clone(
-          MakeRequest(&url_loader_factory->data));
-    }
-  }
-
-  operator ResourceLoaderOptions() const {
-    ResourceLoaderOptions options;
-    options.data_buffering_policy = data_buffering_policy;
-    options.content_security_policy_option = content_security_policy_option;
-    options.initiator_info = initiator_info;
-    options.request_initiator_context = request_initiator_context;
-    options.synchronous_policy = synchronous_policy;
-    options.cors_handling_by_resource_fetcher =
-        cors_handling_by_resource_fetcher;
-    options.cors_flag = cors_flag;
-    options.security_origin = security_origin;
-    options.content_security_policy_nonce = content_security_policy_nonce;
-    options.integrity_metadata = integrity_metadata;
-    options.parser_disposition = parser_disposition;
-    options.cache_aware_loading_enabled = cache_aware_loading_enabled;
-    if (url_loader_factory) {
-      DCHECK(url_loader_factory->data.is_valid());
-      options.url_loader_factory = base::MakeRefCounted<
-          base::RefCountedData<network::mojom::blink::URLLoaderFactoryPtr>>(
-          network::mojom::blink::URLLoaderFactoryPtr(
-              std::move(url_loader_factory->data)));
-    }
-    return options;
-  }
-
-  DataBufferingPolicy data_buffering_policy;
-  ContentSecurityPolicyDisposition content_security_policy_option;
-  CrossThreadFetchInitiatorInfoData initiator_info;
-  RequestInitiatorContext request_initiator_context;
-  SynchronousPolicy synchronous_policy;
-
-  CORSHandlingByResourceFetcher cors_handling_by_resource_fetcher;
-  bool cors_flag;
-  scoped_refptr<const SecurityOrigin> security_origin;
-
-  String content_security_policy_nonce;
-  IntegrityMetadataSet integrity_metadata;
-  ParserDisposition parser_disposition;
-  CacheAwareLoadingEnabled cache_aware_loading_enabled;
-  scoped_refptr<
-      base::RefCountedData<network::mojom::blink::URLLoaderFactoryPtrInfo>>
-      url_loader_factory;
-};
-
-template <>
-struct CrossThreadCopier<ResourceLoaderOptions> {
-  using Type = CrossThreadResourceLoaderOptionsData;
-  static Type Copy(const ResourceLoaderOptions& options) {
-    return CrossThreadResourceLoaderOptionsData(options);
-  }
-};
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESOURCE_LOADER_OPTIONS_H_
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader_options_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader_options_test.cc
deleted file mode 100644
index 9fd9edd..0000000
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader_options_test.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 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 "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include <type_traits>
-
-namespace blink {
-
-namespace {
-
-TEST(ResourceLoaderOptionsTest, DeepCopy) {
-  // Check that the fields of ResourceLoaderOptions are enums, except for
-  // initiatorInfo and securityOrigin.
-  static_assert(std::is_enum<DataBufferingPolicy>::value,
-                "DataBufferingPolicy should be an enum");
-  static_assert(std::is_enum<ContentSecurityPolicyDisposition>::value,
-                "ContentSecurityPolicyDisposition should be an enum");
-  static_assert(std::is_enum<RequestInitiatorContext>::value,
-                "RequestInitiatorContext should be an enum");
-  static_assert(std::is_enum<SynchronousPolicy>::value,
-                "SynchronousPolicy should be an enum");
-  static_assert(std::is_enum<CORSHandlingByResourceFetcher>::value,
-                "CORSHandlingByResourceFetcher should be an enum");
-
-  ResourceLoaderOptions original;
-  scoped_refptr<const SecurityOrigin> security_origin =
-      SecurityOrigin::CreateFromString("http://www.google.com");
-  original.security_origin = security_origin;
-  original.initiator_info.name = AtomicString("xmlhttprequest");
-
-  CrossThreadResourceLoaderOptionsData copy_data =
-      CrossThreadCopier<ResourceLoaderOptions>::Copy(original);
-  ResourceLoaderOptions copy = copy_data;
-
-  // Check that contents are correctly copied to |copyData|
-  EXPECT_EQ(original.data_buffering_policy, copy_data.data_buffering_policy);
-  EXPECT_EQ(original.content_security_policy_option,
-            copy_data.content_security_policy_option);
-  EXPECT_EQ(original.initiator_info.name, copy_data.initiator_info.name);
-  EXPECT_EQ(original.initiator_info.position,
-            copy_data.initiator_info.position);
-  EXPECT_EQ(original.initiator_info.start_time,
-            copy_data.initiator_info.start_time);
-  EXPECT_EQ(original.request_initiator_context,
-            copy_data.request_initiator_context);
-  EXPECT_EQ(original.synchronous_policy, copy_data.synchronous_policy);
-  EXPECT_EQ(original.cors_handling_by_resource_fetcher,
-            copy_data.cors_handling_by_resource_fetcher);
-  EXPECT_EQ(original.security_origin->Protocol(),
-            copy_data.security_origin->Protocol());
-  EXPECT_EQ(original.security_origin->Host(),
-            copy_data.security_origin->Host());
-  EXPECT_EQ(original.security_origin->Domain(),
-            copy_data.security_origin->Domain());
-
-  // Check that pointers are different between |original| and |copyData|
-  EXPECT_NE(original.initiator_info.name.Impl(),
-            copy_data.initiator_info.name.Impl());
-  EXPECT_NE(original.security_origin.get(), copy_data.security_origin.get());
-  EXPECT_NE(original.security_origin->Protocol().Impl(),
-            copy_data.security_origin->Protocol().Impl());
-  EXPECT_NE(original.security_origin->Host().Impl(),
-            copy_data.security_origin->Host().Impl());
-  EXPECT_NE(original.security_origin->Domain().Impl(),
-            copy_data.security_origin->Domain().Impl());
-
-  // Check that contents are correctly copied to |copy|
-  EXPECT_EQ(original.data_buffering_policy, copy.data_buffering_policy);
-  EXPECT_EQ(original.content_security_policy_option,
-            copy.content_security_policy_option);
-  EXPECT_EQ(original.initiator_info.name, copy.initiator_info.name);
-  EXPECT_EQ(original.initiator_info.position, copy.initiator_info.position);
-  EXPECT_EQ(original.initiator_info.start_time, copy.initiator_info.start_time);
-  EXPECT_EQ(original.request_initiator_context, copy.request_initiator_context);
-  EXPECT_EQ(original.synchronous_policy, copy.synchronous_policy);
-  EXPECT_EQ(original.cors_handling_by_resource_fetcher,
-            copy.cors_handling_by_resource_fetcher);
-  EXPECT_EQ(original.security_origin->Protocol(),
-            copy.security_origin->Protocol());
-  EXPECT_EQ(original.security_origin->Host(), copy.security_origin->Host());
-  EXPECT_EQ(original.security_origin->Domain(), copy.security_origin->Domain());
-
-  // Check that pointers are different between |original| and |copy|
-  // FIXME: When |original| and |copy| are in different threads, then
-  // EXPECT_NE(original.initiatorInfo.name.impl(),
-  //           copy.initiatorInfo.name.impl());
-  // should pass. However, in the unit test here, these two pointers are the
-  // same, because initiatorInfo.name is AtomicString.
-  EXPECT_NE(original.security_origin.get(), copy.security_origin.get());
-  EXPECT_NE(original.security_origin->Protocol().Impl(),
-            copy.security_origin->Protocol().Impl());
-  EXPECT_NE(original.security_origin->Host().Impl(),
-            copy.security_origin->Host().Impl());
-  EXPECT_NE(original.security_origin->Domain().Impl(),
-            copy.security_origin->Domain().Impl());
-
-  // FIXME: The checks for content equality/pointer inequality for
-  // securityOrigin here is not complete (i.e. m_filePath is not checked). A
-  // unit test for SecurityOrigin::isolatedCopy() that covers these checks
-  // should be added.
-}
-
-}  // namespace
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
index 409cfe1..291eaa4 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
@@ -83,50 +83,6 @@
           network::mojom::CORSPreflightPolicy::kConsiderPreflight),
       redirect_status_(RedirectStatus::kNoRedirect) {}
 
-ResourceRequest::ResourceRequest(CrossThreadResourceRequestData* data)
-    : ResourceRequest(data->url_) {
-  SetTimeoutInterval(data->timeout_interval_);
-  SetSiteForCookies(data->site_for_cookies_);
-  SetRequestorOrigin(data->requestor_origin_);
-  SetHTTPMethod(AtomicString(data->http_method_));
-  SetPriority(data->priority_, data->intra_priority_value_);
-
-  http_header_fields_.Adopt(std::move(data->http_headers_));
-
-  SetHTTPBody(data->http_body_);
-  SetAllowStoredCredentials(data->allow_stored_credentials_);
-  SetReportUploadProgress(data->report_upload_progress_);
-  SetHasUserGesture(data->has_user_gesture_);
-  SetDownloadToBlob(data->download_to_blob_);
-  SetUseStreamOnResponse(data->use_stream_on_response_);
-  SetKeepalive(data->keepalive_);
-  SetCacheMode(data->cache_mode_);
-  SetSkipServiceWorker(data->skip_service_worker_);
-  SetShouldResetAppCache(data->should_reset_app_cache_);
-  SetRequestorID(data->requestor_id_);
-  SetPluginChildID(data->plugin_child_id_);
-  SetAppCacheHostID(data->app_cache_host_id_);
-  SetPreviewsState(data->previews_state_);
-  SetRequestContext(data->request_context_);
-  SetFrameType(data->frame_type_);
-  SetFetchRequestMode(data->fetch_request_mode_);
-  SetFetchImportanceMode(data->fetch_importance_mode_);
-  SetFetchCredentialsMode(data->fetch_credentials_mode_);
-  SetFetchRedirectMode(data->fetch_redirect_mode_);
-  SetFetchIntegrity(data->fetch_integrity_.IsolatedCopy());
-  SetReferrerString(data->referrer_string_.IsolatedCopy());
-  referrer_policy_ = data->referrer_policy_;
-  did_set_http_referrer_ = data->did_set_http_referrer_;
-  is_external_request_ = data->is_external_request_;
-  cors_preflight_policy_ = data->cors_preflight_policy_;
-  redirect_status_ = data->redirect_status_;
-  suggested_filename_ = data->suggested_filename_;
-  is_ad_resource_ = data->is_ad_resource_;
-  SetInitiatorCSP(data->navigation_csp_);
-  upgrade_if_insecure_ = data->upgrade_if_insecure_;
-  devtools_token_ = data->devtools_token_;
-}
-
 ResourceRequest::ResourceRequest(const ResourceRequest&) = default;
 
 ResourceRequest::~ResourceRequest() = default;
@@ -176,57 +132,6 @@
   return request;
 }
 
-std::unique_ptr<CrossThreadResourceRequestData> ResourceRequest::CopyData()
-    const {
-  std::unique_ptr<CrossThreadResourceRequestData> data =
-      std::make_unique<CrossThreadResourceRequestData>();
-  data->url_ = Url().Copy();
-  data->timeout_interval_ = TimeoutInterval();
-  data->site_for_cookies_ = SiteForCookies().Copy();
-  data->requestor_origin_ =
-      RequestorOrigin() ? RequestorOrigin()->IsolatedCopy() : nullptr;
-  data->http_method_ = HttpMethod().GetString().IsolatedCopy();
-  data->http_headers_ = HttpHeaderFields().CopyData();
-  data->priority_ = Priority();
-  data->intra_priority_value_ = intra_priority_value_;
-
-  if (http_body_)
-    data->http_body_ = http_body_->DeepCopy();
-  data->allow_stored_credentials_ = allow_stored_credentials_;
-  data->report_upload_progress_ = report_upload_progress_;
-  data->has_user_gesture_ = has_user_gesture_;
-  data->download_to_blob_ = download_to_blob_;
-  data->use_stream_on_response_ = use_stream_on_response_;
-  data->keepalive_ = keepalive_;
-  data->cache_mode_ = GetCacheMode();
-  data->skip_service_worker_ = skip_service_worker_;
-  data->should_reset_app_cache_ = should_reset_app_cache_;
-  data->requestor_id_ = requestor_id_;
-  data->plugin_child_id_ = plugin_child_id_;
-  data->app_cache_host_id_ = app_cache_host_id_;
-  data->previews_state_ = previews_state_;
-  data->request_context_ = request_context_;
-  data->frame_type_ = frame_type_;
-  data->fetch_request_mode_ = fetch_request_mode_;
-  data->fetch_importance_mode_ = fetch_importance_mode_;
-  data->fetch_credentials_mode_ = fetch_credentials_mode_;
-  data->fetch_redirect_mode_ = fetch_redirect_mode_;
-  data->fetch_integrity_ = fetch_integrity_.IsolatedCopy();
-  data->referrer_string_ = referrer_string_.IsolatedCopy();
-  data->referrer_policy_ = referrer_policy_;
-  data->did_set_http_referrer_ = did_set_http_referrer_;
-  data->is_external_request_ = is_external_request_;
-  data->cors_preflight_policy_ = cors_preflight_policy_;
-  data->redirect_status_ = redirect_status_;
-  data->suggested_filename_ = suggested_filename_;
-  data->is_ad_resource_ = is_ad_resource_;
-  data->navigation_csp_ = initiator_csp_;
-
-  data->upgrade_if_insecure_ = upgrade_if_insecure_;
-  data->devtools_token_ = devtools_token_;
-  return data;
-}
-
 bool ResourceRequest::IsNull() const {
   return url_.IsNull();
 }
@@ -474,8 +379,4 @@
   return true;
 }
 
-CrossThreadResourceRequestData::CrossThreadResourceRequestData() = default;
-
-CrossThreadResourceRequestData::~CrossThreadResourceRequestData() = default;
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.h b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
index ea57528..668414a 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
@@ -54,7 +54,6 @@
 
 class EncodedFormData;
 class SecurityOrigin;
-struct CrossThreadResourceRequestData;
 
 // A ResourceRequest is a "request" object for ResourceLoader. Conceptually
 // it is https://fetch.spec.whatwg.org/#concept-request, but it contains
@@ -62,10 +61,7 @@
 // of this class and WebURLLoader needs it. See WebURLRequest and
 // WrappedResourceRequest.
 //
-// There are cases where we need to copy a request across threads, and
-// CrossThreadResourceRequestData is a struct for the purpose. When you add a
-// member variable to this class, do not forget to add the corresponding
-// one in CrossThreadResourceRequestData and write copying logic.
+// This class is thread-bound. Do not copy/pass an instance across threads.
 class PLATFORM_EXPORT ResourceRequest final {
   USING_FAST_MALLOC(ResourceRequest);
 
@@ -75,7 +71,6 @@
   ResourceRequest();
   explicit ResourceRequest(const String& url_string);
   explicit ResourceRequest(const KURL&);
-  explicit ResourceRequest(CrossThreadResourceRequestData*);
 
   // TODO(toyoshim): Use std::unique_ptr as much as possible, and hopefully
   // make ResourceRequest WTF_MAKE_NONCOPYABLE. See crbug.com/787704.
@@ -93,9 +88,6 @@
       ReferrerPolicy new_referrer_policy,
       bool skip_service_worker) const;
 
-  // Gets a copy of the data suitable for passing to another thread.
-  std::unique_ptr<CrossThreadResourceRequestData> CopyData() const;
-
   bool IsNull() const;
 
   const KURL& Url() const;
@@ -456,67 +448,6 @@
   String origin_policy_;
 };
 
-// This class is needed to copy a ResourceRequest across threads, because it
-// has some members which cannot be transferred across threads (AtomicString
-// for example).
-// There are some rules / restrictions:
-//  - This struct cannot contain an object that cannot be transferred across
-//    threads (e.g., AtomicString)
-//  - Non-simple members need explicit copying (e.g., String::IsolatedCopy,
-//    KURL::Copy) rather than the copy constructor or the assignment operator.
-struct PLATFORM_EXPORT CrossThreadResourceRequestData {
-  DISALLOW_COPY_AND_ASSIGN(CrossThreadResourceRequestData);
-  USING_FAST_MALLOC(CrossThreadResourceRequestData);
-
- public:
-  CrossThreadResourceRequestData();
-  ~CrossThreadResourceRequestData();
-
-  KURL url_;
-
-  mojom::FetchCacheMode cache_mode_;
-  base::TimeDelta timeout_interval_;
-  KURL site_for_cookies_;
-  scoped_refptr<const SecurityOrigin> requestor_origin_;
-
-  String http_method_;
-  std::unique_ptr<CrossThreadHTTPHeaderMapData> http_headers_;
-  scoped_refptr<EncodedFormData> http_body_;
-  bool allow_stored_credentials_;
-  bool report_upload_progress_;
-  bool has_user_gesture_;
-  bool download_to_blob_;
-  bool skip_service_worker_;
-  bool use_stream_on_response_;
-  bool keepalive_;
-  bool should_reset_app_cache_;
-  ResourceLoadPriority priority_;
-  int intra_priority_value_;
-  int requestor_id_;
-  int plugin_child_id_;
-  int app_cache_host_id_;
-  WebURLRequest::PreviewsState previews_state_;
-  WebURLRequest::RequestContext request_context_;
-  network::mojom::RequestContextFrameType frame_type_;
-  network::mojom::FetchRequestMode fetch_request_mode_;
-  mojom::FetchImportanceMode fetch_importance_mode_;
-  network::mojom::FetchCredentialsMode fetch_credentials_mode_;
-  network::mojom::FetchRedirectMode fetch_redirect_mode_;
-  String fetch_integrity_;
-  String referrer_string_;
-  ReferrerPolicy referrer_policy_;
-  bool did_set_http_referrer_;
-  bool check_for_browser_side_navigation_;
-  bool is_external_request_;
-  network::mojom::CORSPreflightPolicy cors_preflight_policy_;
-  ResourceRequest::RedirectStatus redirect_status_;
-  base::Optional<String> suggested_filename_;
-  bool is_ad_resource_;
-  WebContentSecurityPolicyList navigation_csp_;
-  bool upgrade_if_insecure_;
-  base::Optional<base::UnguessableToken> devtools_token_;
-};
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESOURCE_REQUEST_H_
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc
index 8463c16..ffb5fbc 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc
@@ -14,132 +14,6 @@
 
 namespace blink {
 
-TEST(ResourceRequestTest, CrossThreadResourceRequestData) {
-  ResourceRequest original;
-  original.SetURL(KURL("http://www.example.com/test.htm"));
-  original.SetCacheMode(mojom::FetchCacheMode::kDefault);
-  original.SetTimeoutInterval(base::TimeDelta::FromSeconds(10));
-  original.SetSiteForCookies(KURL("http://www.example.com/first_party.htm"));
-  original.SetRequestorOrigin(
-      SecurityOrigin::Create(KURL("http://www.example.com/first_party.htm")));
-  original.SetHTTPMethod(HTTPNames::GET);
-  original.SetHTTPHeaderField(AtomicString("Foo"), AtomicString("Bar"));
-  original.SetHTTPHeaderField(AtomicString("Piyo"), AtomicString("Fuga"));
-  original.SetPriority(ResourceLoadPriority::kLow, 20);
-
-  scoped_refptr<EncodedFormData> original_body(
-      EncodedFormData::Create("Test Body"));
-  original.SetHTTPBody(original_body);
-  original.SetAllowStoredCredentials(false);
-  original.SetReportUploadProgress(false);
-  original.SetHasUserGesture(false);
-  original.SetDownloadToBlob(false);
-  original.SetSkipServiceWorker(false);
-  original.SetFetchRequestMode(network::mojom::FetchRequestMode::kCORS);
-  original.SetFetchCredentialsMode(
-      network::mojom::FetchCredentialsMode::kSameOrigin);
-  original.SetRequestorID(30);
-  original.SetPluginChildID(40);
-  original.SetAppCacheHostID(50);
-  original.SetRequestContext(WebURLRequest::kRequestContextAudio);
-  original.SetFrameType(network::mojom::RequestContextFrameType::kNested);
-  // TODO(domfarolino): Use SetReferrerString() when we stop setting
-  // ResourceRequest's referrer with SetHTTPReferrer (https://crbug.com/850813).
-  original.SetHTTPReferrer(
-      Referrer("http://www.example.com/referrer.htm", kReferrerPolicyDefault));
-
-  EXPECT_STREQ("http://www.example.com/test.htm",
-               original.Url().GetString().Utf8().data());
-  EXPECT_EQ(mojom::FetchCacheMode::kDefault, original.GetCacheMode());
-  EXPECT_EQ(base::TimeDelta::FromSeconds(10), original.TimeoutInterval());
-  EXPECT_STREQ("http://www.example.com/first_party.htm",
-               original.SiteForCookies().GetString().Utf8().data());
-  EXPECT_STREQ("www.example.com",
-               original.RequestorOrigin()->Host().Utf8().data());
-  EXPECT_STREQ("GET", original.HttpMethod().Utf8().data());
-  EXPECT_STREQ("Bar", original.HttpHeaderFields().Get("Foo").Utf8().data());
-  EXPECT_STREQ("Fuga", original.HttpHeaderFields().Get("Piyo").Utf8().data());
-  EXPECT_EQ(ResourceLoadPriority::kLow, original.Priority());
-  EXPECT_STREQ("Test Body",
-               original.HttpBody()->FlattenToString().Utf8().data());
-  EXPECT_FALSE(original.AllowStoredCredentials());
-  EXPECT_FALSE(original.ReportUploadProgress());
-  EXPECT_FALSE(original.HasUserGesture());
-  EXPECT_FALSE(original.DownloadToBlob());
-  EXPECT_FALSE(original.GetSkipServiceWorker());
-  EXPECT_EQ(network::mojom::FetchRequestMode::kCORS,
-            original.GetFetchRequestMode());
-  EXPECT_EQ(network::mojom::FetchCredentialsMode::kSameOrigin,
-            original.GetFetchCredentialsMode());
-  EXPECT_EQ(30, original.RequestorID());
-  EXPECT_EQ(40, original.GetPluginChildID());
-  EXPECT_EQ(50, original.AppCacheHostID());
-  EXPECT_EQ(WebURLRequest::kRequestContextAudio, original.GetRequestContext());
-  EXPECT_EQ(network::mojom::RequestContextFrameType::kNested,
-            original.GetFrameType());
-  // TODO(domfarolino): Use GetReferrerString() when we stop setting
-  // ResourceRequest's referrer with SetHTTPReferrer (https://crbug.com/850813).
-  EXPECT_STREQ("http://www.example.com/referrer.htm",
-               original.HttpReferrer().Utf8().data());
-  EXPECT_EQ(kReferrerPolicyDefault, original.GetReferrerPolicy());
-
-  std::unique_ptr<CrossThreadResourceRequestData> data1(original.CopyData());
-  ResourceRequest copy1(data1.get());
-
-  EXPECT_STREQ("http://www.example.com/test.htm",
-               copy1.Url().GetString().Utf8().data());
-  EXPECT_EQ(mojom::FetchCacheMode::kDefault, copy1.GetCacheMode());
-  EXPECT_EQ(base::TimeDelta::FromSeconds(10), copy1.TimeoutInterval());
-  EXPECT_STREQ("http://www.example.com/first_party.htm",
-               copy1.SiteForCookies().GetString().Utf8().data());
-  EXPECT_STREQ("www.example.com",
-               copy1.RequestorOrigin()->Host().Utf8().data());
-  EXPECT_STREQ("GET", copy1.HttpMethod().Utf8().data());
-  EXPECT_STREQ("Bar", copy1.HttpHeaderFields().Get("Foo").Utf8().data());
-  EXPECT_EQ(ResourceLoadPriority::kLow, copy1.Priority());
-  EXPECT_STREQ("Test Body", copy1.HttpBody()->FlattenToString().Utf8().data());
-  EXPECT_FALSE(copy1.AllowStoredCredentials());
-  EXPECT_FALSE(copy1.ReportUploadProgress());
-  EXPECT_FALSE(copy1.HasUserGesture());
-  EXPECT_FALSE(copy1.DownloadToBlob());
-  EXPECT_FALSE(copy1.GetSkipServiceWorker());
-  EXPECT_EQ(network::mojom::FetchRequestMode::kCORS,
-            copy1.GetFetchRequestMode());
-  EXPECT_EQ(network::mojom::FetchCredentialsMode::kSameOrigin,
-            copy1.GetFetchCredentialsMode());
-  EXPECT_EQ(30, copy1.RequestorID());
-  EXPECT_EQ(40, copy1.GetPluginChildID());
-  EXPECT_EQ(50, copy1.AppCacheHostID());
-  EXPECT_EQ(WebURLRequest::kRequestContextAudio, copy1.GetRequestContext());
-  EXPECT_EQ(network::mojom::RequestContextFrameType::kNested,
-            copy1.GetFrameType());
-  // TODO(domfarolino): Use GetReferrerString() when we stop setting
-  // ResourceRequest's referrer with SetHTTPReferrer (https://crbug.com/850813).
-  EXPECT_STREQ("http://www.example.com/referrer.htm",
-               copy1.HttpReferrer().Utf8().data());
-  EXPECT_EQ(kReferrerPolicyDefault, copy1.GetReferrerPolicy());
-
-  copy1.SetAllowStoredCredentials(true);
-  copy1.SetReportUploadProgress(true);
-  copy1.SetHasUserGesture(true);
-  copy1.SetDownloadToBlob(true);
-  copy1.SetSkipServiceWorker(true);
-  copy1.SetFetchRequestMode(network::mojom::FetchRequestMode::kNoCORS);
-  copy1.SetFetchCredentialsMode(network::mojom::FetchCredentialsMode::kInclude);
-
-  std::unique_ptr<CrossThreadResourceRequestData> data2(copy1.CopyData());
-  ResourceRequest copy2(data2.get());
-  EXPECT_TRUE(copy2.AllowStoredCredentials());
-  EXPECT_TRUE(copy2.ReportUploadProgress());
-  EXPECT_TRUE(copy2.HasUserGesture());
-  EXPECT_TRUE(copy2.DownloadToBlob());
-  EXPECT_TRUE(copy2.GetSkipServiceWorker());
-  EXPECT_EQ(network::mojom::FetchRequestMode::kNoCORS,
-            copy1.GetFetchRequestMode());
-  EXPECT_EQ(network::mojom::FetchCredentialsMode::kInclude,
-            copy1.GetFetchCredentialsMode());
-}
-
 TEST(ResourceRequestTest, SetHasUserGesture) {
   ResourceRequest original;
   EXPECT_FALSE(original.HasUserGesture());
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_response.cc b/third_party/blink/renderer/platform/loader/fetch/resource_response.cc
index 8771ae8..4404a859 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_response.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_response.cc
@@ -90,134 +90,10 @@
       text_encoding_name_(text_encoding_name),
       is_null_(false) {}
 
-ResourceResponse::ResourceResponse(CrossThreadResourceResponseData* data)
-    : ResourceResponse() {
-  SetURL(data->url_);
-  SetMimeType(AtomicString(data->mime_type_));
-  SetExpectedContentLength(data->expected_content_length_);
-  SetTextEncodingName(AtomicString(data->text_encoding_name_));
-
-  SetHTTPStatusCode(data->http_status_code_);
-  SetHTTPStatusText(AtomicString(data->http_status_text_));
-
-  http_header_fields_.Adopt(std::move(data->http_headers_));
-  SetResourceLoadTiming(std::move(data->resource_load_timing_));
-  remote_ip_address_ = AtomicString(data->remote_ip_address_);
-  remote_port_ = data->remote_port_;
-  has_major_certificate_errors_ = data->has_major_certificate_errors_;
-  ct_policy_compliance_ = data->ct_policy_compliance_;
-  is_legacy_symantec_cert_ = data->is_legacy_symantec_cert_;
-  cert_validity_start_ = data->cert_validity_start_;
-  was_fetched_via_spdy_ = data->was_fetched_via_spdy_;
-  was_fetched_via_proxy_ = data->was_fetched_via_proxy_;
-  was_fetched_via_service_worker_ = data->was_fetched_via_service_worker_;
-  was_fallback_required_by_service_worker_ =
-      data->was_fallback_required_by_service_worker_;
-  did_service_worker_navigation_preload_ =
-      data->did_service_worker_navigation_preload_;
-  async_revalidation_requested_ = data->async_revalidation_requested_;
-  response_type_via_service_worker_ = data->response_type_via_service_worker_;
-  security_style_ = data->security_style_;
-  security_details_.protocol = data->security_details_.protocol;
-  security_details_.cipher = data->security_details_.cipher;
-  security_details_.key_exchange = data->security_details_.key_exchange;
-  security_details_.key_exchange_group =
-      data->security_details_.key_exchange_group;
-  security_details_.mac = data->security_details_.mac;
-  security_details_.subject_name = data->security_details_.subject_name;
-  security_details_.san_list = data->security_details_.san_list;
-  security_details_.issuer = data->security_details_.issuer;
-  security_details_.valid_from = data->security_details_.valid_from;
-  security_details_.valid_to = data->security_details_.valid_to;
-  for (auto& cert : data->certificate_)
-    security_details_.certificate.push_back(AtomicString(cert));
-  security_details_.sct_list = data->security_details_.sct_list;
-  http_version_ = data->http_version_;
-  app_cache_id_ = data->app_cache_id_;
-  app_cache_manifest_url_ = data->app_cache_manifest_url_.Copy();
-  multipart_boundary_ = data->multipart_boundary_;
-  url_list_via_service_worker_ = data->url_list_via_service_worker_;
-  cache_storage_cache_name_ = data->cache_storage_cache_name_;
-  response_time_ = data->response_time_;
-  encoded_data_length_ = data->encoded_data_length_;
-  encoded_body_length_ = data->encoded_body_length_;
-  decoded_body_length_ = data->decoded_body_length_;
-
-  // Bug https://bugs.webkit.org/show_bug.cgi?id=60397 this doesn't support
-  // whatever values may be present in the opaque m_extraData structure.
-}
-
 ResourceResponse::ResourceResponse(const ResourceResponse&) = default;
 ResourceResponse& ResourceResponse::operator=(const ResourceResponse&) =
     default;
 
-std::unique_ptr<CrossThreadResourceResponseData> ResourceResponse::CopyData()
-    const {
-  std::unique_ptr<CrossThreadResourceResponseData> data =
-      std::make_unique<CrossThreadResourceResponseData>();
-  data->url_ = Url().Copy();
-  data->mime_type_ = MimeType().GetString().IsolatedCopy();
-  data->expected_content_length_ = ExpectedContentLength();
-  data->text_encoding_name_ = TextEncodingName().GetString().IsolatedCopy();
-  data->http_status_code_ = HttpStatusCode();
-  data->http_status_text_ = HttpStatusText().GetString().IsolatedCopy();
-  data->http_headers_ = HttpHeaderFields().CopyData();
-  if (resource_load_timing_)
-    data->resource_load_timing_ = resource_load_timing_->DeepCopy();
-  data->remote_ip_address_ = remote_ip_address_.GetString().IsolatedCopy();
-  data->remote_port_ = remote_port_;
-  data->has_major_certificate_errors_ = has_major_certificate_errors_;
-  data->ct_policy_compliance_ = ct_policy_compliance_;
-  data->is_legacy_symantec_cert_ = is_legacy_symantec_cert_;
-  data->cert_validity_start_ = cert_validity_start_;
-  data->was_fetched_via_spdy_ = was_fetched_via_spdy_;
-  data->was_fetched_via_proxy_ = was_fetched_via_proxy_;
-  data->was_fetched_via_service_worker_ = was_fetched_via_service_worker_;
-  data->was_fallback_required_by_service_worker_ =
-      was_fallback_required_by_service_worker_;
-  data->did_service_worker_navigation_preload_ =
-      did_service_worker_navigation_preload_;
-  data->async_revalidation_requested_ = async_revalidation_requested_;
-  data->response_type_via_service_worker_ = response_type_via_service_worker_;
-  data->security_style_ = security_style_;
-  data->security_details_.protocol = security_details_.protocol.IsolatedCopy();
-  data->security_details_.cipher = security_details_.cipher.IsolatedCopy();
-  data->security_details_.key_exchange =
-      security_details_.key_exchange.IsolatedCopy();
-  data->security_details_.key_exchange_group =
-      security_details_.key_exchange_group.IsolatedCopy();
-  data->security_details_.mac = security_details_.mac.IsolatedCopy();
-  data->security_details_.subject_name =
-      security_details_.subject_name.IsolatedCopy();
-  data->security_details_.san_list = IsolatedCopy(security_details_.san_list);
-  data->security_details_.issuer = security_details_.issuer.IsolatedCopy();
-  data->security_details_.valid_from = security_details_.valid_from;
-  data->security_details_.valid_to = security_details_.valid_to;
-  for (auto& cert : security_details_.certificate)
-    data->certificate_.push_back(cert.GetString().IsolatedCopy());
-  data->security_details_.sct_list = IsolatedCopy(security_details_.sct_list);
-  data->http_version_ = http_version_;
-  data->app_cache_id_ = app_cache_id_;
-  data->app_cache_manifest_url_ = app_cache_manifest_url_.Copy();
-  data->multipart_boundary_ = multipart_boundary_;
-  data->url_list_via_service_worker_.resize(
-      url_list_via_service_worker_.size());
-  std::transform(url_list_via_service_worker_.begin(),
-                 url_list_via_service_worker_.end(),
-                 data->url_list_via_service_worker_.begin(),
-                 [](const KURL& url) { return url.Copy(); });
-  data->cache_storage_cache_name_ = CacheStorageCacheName().IsolatedCopy();
-  data->response_time_ = response_time_;
-  data->encoded_data_length_ = encoded_data_length_;
-  data->encoded_body_length_ = encoded_body_length_;
-  data->decoded_body_length_ = decoded_body_length_;
-
-  // Bug https://bugs.webkit.org/show_bug.cgi?id=60397 this doesn't support
-  // whatever values may be present in the opaque m_extraData structure.
-
-  return data;
-}
-
 bool ResourceResponse::IsHTTP() const {
   return url_.ProtocolIsInHTTPFamily();
 }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_response.h b/third_party/blink/renderer/platform/loader/fetch/resource_response.h
index 05ba712..7fa925f 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_response.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_response.h
@@ -49,17 +49,12 @@
 
 namespace blink {
 
-struct CrossThreadResourceResponseData;
-
 // A ResourceResponse is a "response" object used in blink. Conceptually
 // it is https://fetch.spec.whatwg.org/#concept-response, but it contains
 // a lot of blink specific fields. WebURLResponse is the "public version"
 // of this class and public classes (i.e., classes in public/platform) use it.
 //
-// There are cases where we need to copy a response across threads, and
-// CrossThreadResourceResponseData is a struct for the purpose. When you add a
-// member variable to this class, do not forget to add the corresponding
-// one in CrossThreadResourceResponseData and write copying logic.
+// This class is thread-bound. Do not copy/pass an instance across threads.
 class PLATFORM_EXPORT ResourceResponse final {
  public:
   enum HTTPVersion : uint8_t {
@@ -147,11 +142,6 @@
     virtual ~ExtraData() = default;
   };
 
-  explicit ResourceResponse(CrossThreadResourceResponseData*);
-
-  // Gets a copy of the data suitable for passing to another thread.
-  std::unique_ptr<CrossThreadResourceResponseData> CopyData() const;
-
   ResourceResponse();
   explicit ResourceResponse(
       const KURL&,
@@ -466,9 +456,6 @@
   // Was the resource fetched over SPDY.  See http://dev.chromium.org/spdy
   bool was_fetched_via_spdy_ = false;
 
-  // Was the resource fetched over an explicit proxy (HTTP, SOCKS, etc).
-  bool was_fetched_via_proxy_ = false;
-
   // Was the resource fetched over a ServiceWorker.
   bool was_fetched_via_service_worker_ = false;
 
@@ -569,58 +556,6 @@
   return !(a == b);
 }
 
-// This class is needed to copy a ResourceResponse across threads, because it
-// has some members which cannot be transferred across threads (AtomicString
-// for example).
-// There are some rules / restrictions:
-//  - This struct cannot contain an object that cannot be transferred across
-//    threads (e.g., AtomicString)
-//  - Non-simple members need explicit copying (e.g., String::IsolatedCopy,
-//    KURL::Copy) rather than the copy constructor or the assignment operator.
-struct CrossThreadResourceResponseData {
-  WTF_MAKE_NONCOPYABLE(CrossThreadResourceResponseData);
-  USING_FAST_MALLOC(CrossThreadResourceResponseData);
-
- public:
-  CrossThreadResourceResponseData() = default;
-  KURL url_;
-  String mime_type_;
-  long long expected_content_length_;
-  String text_encoding_name_;
-  int http_status_code_;
-  String http_status_text_;
-  std::unique_ptr<CrossThreadHTTPHeaderMapData> http_headers_;
-  scoped_refptr<ResourceLoadTiming> resource_load_timing_;
-  bool has_major_certificate_errors_;
-  ResourceResponse::CTPolicyCompliance ct_policy_compliance_;
-  bool is_legacy_symantec_cert_;
-  base::Time cert_validity_start_;
-  ResourceResponse::SecurityStyle security_style_;
-  ResourceResponse::SecurityDetails security_details_;
-  // This is |certificate| from SecurityDetails since that structure should
-  // use an AtomicString but this temporary structure is sent across threads.
-  Vector<String> certificate_;
-  ResourceResponse::HTTPVersion http_version_;
-  long long app_cache_id_;
-  KURL app_cache_manifest_url_;
-  Vector<char> multipart_boundary_;
-  bool was_fetched_via_spdy_;
-  bool was_fetched_via_proxy_;
-  bool was_fetched_via_service_worker_;
-  bool was_fallback_required_by_service_worker_;
-  network::mojom::FetchResponseType response_type_via_service_worker_;
-  Vector<KURL> url_list_via_service_worker_;
-  String cache_storage_cache_name_;
-  bool did_service_worker_navigation_preload_;
-  bool async_revalidation_requested_;
-  Time response_time_;
-  String remote_ip_address_;
-  unsigned short remote_port_;
-  long long encoded_data_length_;
-  long long encoded_body_length_;
-  long long decoded_body_length_;
-};
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESOURCE_RESPONSE_H_
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.cc b/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.cc
index 31574cf..a01ad93 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.cc
@@ -5,45 +5,9 @@
 #include "third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h"
 
 #include <memory>
-#include "third_party/blink/renderer/platform/cross_thread_copier.h"
 
 namespace blink {
 
-scoped_refptr<ResourceTimingInfo> ResourceTimingInfo::Adopt(
-    std::unique_ptr<CrossThreadResourceTimingInfoData> data) {
-  scoped_refptr<ResourceTimingInfo> info = ResourceTimingInfo::Create(
-      AtomicString(data->type_), data->initial_time_, data->is_main_resource_);
-  info->original_timing_allow_origin_ =
-      AtomicString(data->original_timing_allow_origin_);
-  info->load_finish_time_ = data->load_finish_time_;
-  info->initial_url_ = data->initial_url_.Copy();
-  info->final_response_ = ResourceResponse(data->final_response_.get());
-  for (auto& response_data : data->redirect_chain_)
-    info->redirect_chain_.push_back(ResourceResponse(response_data.get()));
-  info->transfer_size_ = data->transfer_size_;
-  info->negative_allowed_ = data->negative_allowed_;
-  return info;
-}
-
-std::unique_ptr<CrossThreadResourceTimingInfoData>
-ResourceTimingInfo::CopyData() const {
-  std::unique_ptr<CrossThreadResourceTimingInfoData> data =
-      std::make_unique<CrossThreadResourceTimingInfoData>();
-  data->type_ = type_.GetString().IsolatedCopy();
-  data->original_timing_allow_origin_ =
-      original_timing_allow_origin_.GetString().IsolatedCopy();
-  data->initial_time_ = initial_time_;
-  data->load_finish_time_ = load_finish_time_;
-  data->initial_url_ = initial_url_.Copy();
-  data->final_response_ = final_response_.CopyData();
-  for (const auto& response : redirect_chain_)
-    data->redirect_chain_.push_back(response.CopyData());
-  data->transfer_size_ = transfer_size_;
-  data->is_main_resource_ = is_main_resource_;
-  data->negative_allowed_ = negative_allowed_;
-  return data;
-}
-
 void ResourceTimingInfo::AddRedirect(const ResourceResponse& redirect_response,
                                      bool cross_origin) {
   redirect_chain_.push_back(redirect_response);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h b/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h
index afff3bf..eba6076 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h
@@ -32,7 +32,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESOURCE_TIMING_INFO_H_
 
 #include <memory>
-#include "third_party/blink/renderer/platform/cross_thread_copier.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
@@ -43,8 +42,6 @@
 
 namespace blink {
 
-struct CrossThreadResourceTimingInfoData;
-
 class PLATFORM_EXPORT ResourceTimingInfo
     : public RefCounted<ResourceTimingInfo> {
   USING_FAST_MALLOC(ResourceTimingInfo);
@@ -56,12 +53,6 @@
                                                   bool is_main_resource) {
     return base::AdoptRef(new ResourceTimingInfo(type, time, is_main_resource));
   }
-  static scoped_refptr<ResourceTimingInfo> Adopt(
-      std::unique_ptr<CrossThreadResourceTimingInfoData>);
-
-  // Gets a copy of the data suitable for passing to another thread.
-  std::unique_ptr<CrossThreadResourceTimingInfoData> CopyData() const;
-
   TimeTicks InitialTime() const { return initial_time_; }
   bool IsMainResource() const { return is_main_resource_; }
 
@@ -133,34 +124,6 @@
   bool negative_allowed_ = false;
 };
 
-struct CrossThreadResourceTimingInfoData {
-  WTF_MAKE_NONCOPYABLE(CrossThreadResourceTimingInfoData);
-  USING_FAST_MALLOC(CrossThreadResourceTimingInfoData);
-
- public:
-  CrossThreadResourceTimingInfoData() = default;
-
-  String type_;
-  String original_timing_allow_origin_;
-  TimeTicks initial_time_;
-  TimeTicks load_finish_time_;
-  KURL initial_url_;
-  std::unique_ptr<CrossThreadResourceResponseData> final_response_;
-  Vector<std::unique_ptr<CrossThreadResourceResponseData>> redirect_chain_;
-  long long transfer_size_;
-  bool is_main_resource_;
-  bool negative_allowed_;
-};
-
-template <>
-struct CrossThreadCopier<ResourceTimingInfo> {
-  typedef WTF::PassedWrapper<std::unique_ptr<CrossThreadResourceTimingInfoData>>
-      Type;
-  static Type Copy(const ResourceTimingInfo& info) {
-    return WTF::Passed(info.CopyData());
-  }
-};
-
 }  // namespace blink
 
 #endif
diff --git a/third_party/tcmalloc/DEPS b/third_party/tcmalloc/DEPS
index b0a0897..950de69 100644
--- a/third_party/tcmalloc/DEPS
+++ b/third_party/tcmalloc/DEPS
@@ -4,4 +4,9 @@
   '+gperftools',
   '+tests',
   '+../config.h',
+  # The auto-generated gperftools config.h file uses relative paths to
+  # include headers from the windows/ subfolder. Adding the relative paths
+  # to DEPS to minimize manual edits on future uprevs.
+  '+windows/mingw.h',
+  '+windows/port.h',
 ]
diff --git a/third_party/tcmalloc/chromium/src/config.h b/third_party/tcmalloc/chromium/src/config.h
new file mode 100644
index 0000000..62c1276
--- /dev/null
+++ b/third_party/tcmalloc/chromium/src/config.h
@@ -0,0 +1,19 @@
+// Copyright (c) 2009 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 CONFIG_H_
+
+#include "build/build_config.h"
+
+#if defined(OS_WIN)
+#include "third_party/tcmalloc/chromium/src/config_win.h"
+#elif defined(OS_ANDROID)
+#include "third_party/tcmalloc/chromium/src/config_android.h"
+#elif defined(OS_LINUX)
+#include "third_party/tcmalloc/chromium/src/config_linux.h"
+#elif defined(OS_FREEBSD)
+#include "third_party/tcmalloc/chromium/src/config_freebsd.h"
+#endif
+
+#endif  // CONFIG_H_
diff --git a/third_party/tcmalloc/chromium/src/config_android.h b/third_party/tcmalloc/chromium/src/config_android.h
new file mode 100644
index 0000000..e33820e
--- /dev/null
+++ b/third_party/tcmalloc/chromium/src/config_android.h
@@ -0,0 +1 @@
+#error "File must be generated from config.h.in by configure."
diff --git a/third_party/tcmalloc/chromium/src/config_freebsd.h b/third_party/tcmalloc/chromium/src/config_freebsd.h
new file mode 100644
index 0000000..e33820e
--- /dev/null
+++ b/third_party/tcmalloc/chromium/src/config_freebsd.h
@@ -0,0 +1 @@
+#error "File must be generated from config.h.in by configure."
diff --git a/third_party/tcmalloc/chromium/src/config_linux.h b/third_party/tcmalloc/chromium/src/config_linux.h
new file mode 100644
index 0000000..4e8e398
--- /dev/null
+++ b/third_party/tcmalloc/chromium/src/config_linux.h
@@ -0,0 +1,316 @@
+/* src/config.h.  Generated from config.h.in by configure.  */
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+#ifndef GPERFTOOLS_CONFIG_H_
+#define GPERFTOOLS_CONFIG_H_
+
+/* Build new/delete operators for overaligned types */
+/* #undef ENABLE_ALIGNED_NEW_DELETE */
+
+/* Build runtime detection for sized delete */
+/* #undef ENABLE_DYNAMIC_SIZED_DELETE */
+
+/* Build sized deletion operators */
+/* #undef ENABLE_SIZED_DELETE */
+
+/* Define to 1 if compiler supports __builtin_expect */
+#if defined(__GNUC__)
+#define HAVE_BUILTIN_EXPECT 1
+#endif
+
+/* Define to 1 if compiler supports __builtin_stack_pointer */
+/* #undef HAVE_BUILTIN_STACK_POINTER */
+
+/* Define to 1 if you have the <conflict-signal.h> header file. */
+/* #undef HAVE_CONFLICT_SIGNAL_H */
+
+/* Define to 1 if you have the <cygwin/signal.h> header file. */
+/* #undef HAVE_CYGWIN_SIGNAL_H */
+
+/* Define to 1 if you have the declaration of `backtrace', and to 0 if you
+   don't. */
+/* #undef HAVE_DECL_BACKTRACE */
+
+/* Define to 1 if you have the declaration of `cfree', and to 0 if you don't.
+ */
+#define HAVE_DECL_CFREE 1
+
+/* Define to 1 if you have the declaration of `memalign', and to 0 if you
+   don't. */
+#define HAVE_DECL_MEMALIGN 1
+
+/* Define to 1 if you have the declaration of `nanosleep', and to 0 if you
+   don't. */
+/* #undef HAVE_DECL_NANOSLEEP */
+
+/* Define to 1 if you have the declaration of `posix_memalign', and to 0 if
+   you don't. */
+#define HAVE_DECL_POSIX_MEMALIGN 1
+
+/* Define to 1 if you have the declaration of `pvalloc', and to 0 if you
+   don't. */
+#define HAVE_DECL_PVALLOC 1
+
+/* Define to 1 if you have the declaration of `sleep', and to 0 if you don't.
+ */
+/* #undef HAVE_DECL_SLEEP */
+
+/* Define to 1 if you have the declaration of `uname', and to 0 if you don't.
+ */
+#define HAVE_DECL_UNAME 1
+
+/* Define to 1 if you have the declaration of `valloc', and to 0 if you don't.
+ */
+#define HAVE_DECL_VALLOC 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if the system has the type `Elf32_Versym'. */
+#define HAVE_ELF32_VERSYM 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#define HAVE_EXECINFO_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the <features.h> header file. */
+#define HAVE_FEATURES_H 1
+
+/* Define to 1 if you have the `fork' function. */
+#define HAVE_FORK 1
+
+/* Define to 1 if you have the `geteuid' function. */
+#define HAVE_GETEUID 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the <glob.h> header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the <grp.h> header file. */
+#define HAVE_GRP_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <libunwind.h> header file. */
+/* #undef HAVE_LIBUNWIND_H */
+
+/* Define to 1 if you have the <linux/ptrace.h> header file. */
+#define HAVE_LINUX_PTRACE_H 1
+
+/* Define if this is Linux that has SIGEV_THREAD_ID */
+#define HAVE_LINUX_SIGEV_THREAD_ID 1
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#define HAVE_MALLOC_H 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+#define HAVE_MMAP 1
+
+/* define if the compiler implements namespaces */
+#define HAVE_NAMESPACES 1
+
+/* Define to 1 if you have the <poll.h> header file. */
+#define HAVE_POLL_H 1
+
+/* define if libc has program_invocation_name */
+#define HAVE_PROGRAM_INVOCATION_NAME 1
+
+/* Define if you have POSIX threads libraries and header files. */
+#define HAVE_PTHREAD 1
+
+/* defined to 1 if pthread symbols are exposed even without include pthread.h
+ */
+/* #undef HAVE_PTHREAD_DESPITE_ASKING_FOR */
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H 1
+
+/* Define to 1 if you have the `sbrk' function. */
+#define HAVE_SBRK 1
+
+/* Define to 1 if you have the <sched.h> header file. */
+#define HAVE_SCHED_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if the system has the type `struct mallinfo'. */
+#define HAVE_STRUCT_MALLINFO 1
+
+/* Define to 1 if you have the <sys/cdefs.h> header file. */
+#define HAVE_SYS_CDEFS_H 1
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#define HAVE_SYS_PRCTL_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/syscall.h> header file. */
+#define HAVE_SYS_SYSCALL_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/ucontext.h> header file. */
+#define HAVE_SYS_UCONTEXT_H 1
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if compiler supports __thread */
+#define HAVE_TLS 1
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+#define HAVE_UCONTEXT_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Whether <unwind.h> contains _Unwind_Backtrace */
+#define HAVE_UNWIND_BACKTRACE 1
+
+/* Define to 1 if you have the <unwind.h> header file. */
+#define HAVE_UNWIND_H 1
+
+/* Define to 1 if you have the <valgrind.h> header file. */
+/* #undef HAVE_VALGRIND_H */
+
+/* define if your compiler has __attribute__ */
+#define HAVE___ATTRIBUTE__ 1
+
+/* define if your compiler supports alignment of functions */
+#define HAVE___ATTRIBUTE__ALIGNED_FN 1
+
+/* Define to 1 if compiler supports __environ */
+#define HAVE___ENVIRON 1
+
+/* Define to 1 if the system has the type `__int64'. */
+/* #undef HAVE___INT64 */
+
+/* prefix where we look for installed files */
+#define INSTALL_PREFIX "/usr/local"
+
+/* Define to 1 if int32_t is equivalent to intptr_t */
+/* #undef INT32_EQUALS_INTPTR */
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "gperftools"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "gperftools@googlegroups.com"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "gperftools"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "gperftools 2.7"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gperftools"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.7"
+
+/* How to access the PC from a struct ucontext */
+/* TODO(asharif): configure.ac should be changed such that this define gets
+ * generated automatically. That change should go to upstream and then pulled
+ * back here. */
+#if defined(__arm__)
+#define PC_FROM_UCONTEXT uc_mcontext.arm_pc
+#else
+#define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP]
+#endif
+
+/* Always the empty-string on non-windows systems. On windows, should be
+   "__declspec(dllexport)". This way, when we compile the dll, we export our
+   functions/classes. It's safe to define this here because config.h is only
+   used internally, to compile the DLL, and every DLL source file #includes
+   "config.h" before anything else. */
+#define PERFTOOLS_DLL_DECL /**/
+
+/* printf format code for printing a size_t and ssize_t */
+#define PRIdS "zd"
+
+/* printf format code for printing a size_t and ssize_t */
+#define PRIuS "zu"
+
+/* printf format code for printing a size_t and ssize_t */
+#define PRIxS "zx"
+
+/* Mark the systems where we know it's bad if pthreads runs too
+   early before main (before threads are initialized, presumably).  */
+#ifdef __FreeBSD__
+#define PTHREADS_CRASHES_IF_RUN_TOO_EARLY 1
+#endif
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* the namespace where STL code like vector<> is defined */
+#define STL_NAMESPACE std
+
+/* Define 32K of internal pages size for tcmalloc */
+/* #undef TCMALLOC_32K_PAGES */
+
+/* Define 64K of internal pages size for tcmalloc */
+/* #undef TCMALLOC_64K_PAGES */
+
+/* Define 8 bytes of allocation alignment for tcmalloc */
+/* #undef TCMALLOC_ALIGN_8BYTES */
+
+/* Version number of package */
+#define VERSION "2.7"
+
+/* C99 says: define this to get the PRI... macros from stdint.h */
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS 1
+#endif
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+#ifdef __MINGW32__
+#include "windows/mingw.h"
+#endif
+
+#endif /* #ifndef GPERFTOOLS_CONFIG_H_ */
diff --git a/third_party/tcmalloc/chromium/src/config_win.h b/third_party/tcmalloc/chromium/src/config_win.h
new file mode 100644
index 0000000..f22a34b
--- /dev/null
+++ b/third_party/tcmalloc/chromium/src/config_win.h
@@ -0,0 +1,313 @@
+/* A manual version of config.h fit for windows machines. */
+#error \
+    "File copied from older tcmalloc version. Must be updated for new versions."
+
+/* Sometimes we accidentally #include this config.h instead of the one
+   in .. -- this is particularly true for msys/mingw, which uses the
+   unix config.h but also runs code in the windows directory.
+   */
+#ifdef __MINGW32__
+#include "../config.h"
+#define GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_
+#endif
+
+#ifndef GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_
+#define GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_
+
+/* define this if you are linking tcmalloc statically and overriding the
+ * default allocators.
+ * For instructions on how to use this mode, see
+ * http://groups.google.com/group/google-perftools/browse_thread/thread/41cd3710af85e57b
+ */
+#define WIN32_OVERRIDE_ALLOCATORS
+
+/* the location of <hash_map> */
+#define HASH_MAP_H <hash_map>
+
+/* the namespace of hash_map/hash_set */
+#define HASH_NAMESPACE stdext
+
+/* the location of <hash_set> */
+#define HASH_SET_H <hash_set>
+
+/* Define to 1 if your libc has a snprintf implementation */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if compiler supports __builtin_stack_pointer */
+#undef HAVE_BUILTIN_STACK_POINTER
+
+/* Define to 1 if you have the <conflict-signal.h> header file. */
+#undef HAVE_CONFLICT_SIGNAL_H
+
+/* Define to 1 if you have the <cygwin/signal.h> header file. */
+#undef HAVE_CYGWIN_SIGNAL_H
+
+/* Define to 1 if you have the declaration of `cfree', and to 0 if you don't.
+ */
+#undef HAVE_DECL_CFREE
+
+/* Define to 1 if you have the declaration of `memalign', and to 0 if you
+   don't. */
+#undef HAVE_DECL_MEMALIGN
+
+/* Define to 1 if you have the declaration of `posix_memalign', and to 0 if
+   you don't. */
+#undef HAVE_DECL_POSIX_MEMALIGN
+
+/* Define to 1 if you have the declaration of `pvalloc', and to 0 if you
+   don't. */
+#undef HAVE_DECL_PVALLOC
+
+/* Define to 1 if you have the declaration of `uname', and to 0 if you don't.
+ */
+#undef HAVE_DECL_UNAME
+
+/* Define to 1 if you have the declaration of `valloc', and to 0 if you don't.
+ */
+#undef HAVE_DECL_VALLOC
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if the system has the type `Elf32_Versym'. */
+#undef HAVE_ELF32_VERSYM
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#undef HAVE_EXECINFO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the <features.h> header file. */
+#undef HAVE_FEATURES_H
+
+/* Define to 1 if you have the `geteuid' function. */
+#undef HAVE_GETEUID
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1 /* we define it in windows/port.cc */
+
+/* Define to 1 if you have the <glob.h> header file. */
+#undef HAVE_GLOB_H
+
+/* Define to 1 if you have the <grp.h> header file. */
+#undef HAVE_GRP_H
+
+/* define if the compiler has hash_map */
+#define HAVE_HASH_MAP 1
+
+/* define if the compiler has hash_set */
+#define HAVE_HASH_SET 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <libunwind.h> header file. */
+#undef HAVE_LIBUNWIND_H
+
+/* Define to 1 if you have the <linux/ptrace.h> header file. */
+#undef HAVE_LINUX_PTRACE_H
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the <malloc/malloc.h> header file. */
+#undef HAVE_MALLOC_MALLOC_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* define if the compiler implements namespaces */
+#define HAVE_NAMESPACES 1
+
+/* Define to 1 if you have the <poll.h> header file. */
+#undef HAVE_POLL_H
+
+/* define if libc has program_invocation_name */
+#undef HAVE_PROGRAM_INVOCATION_NAME
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `sbrk' function. */
+#undef HAVE_SBRK
+/* Define to 1 if you have the <sched.h> header file. */
+#undef HAVE_SCHED_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if the system has the type `struct mallinfo'. */
+#undef HAVE_STRUCT_MALLINFO
+
+/* Define to 1 if you have the <sys/cdefs.h> header file. */
+#undef HAVE_SYS_CDEFS_H
+
+/* Define to 1 if you have the <sys/malloc.h> header file. */
+#undef HAVE_SYS_MALLOC_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#undef HAVE_SYS_PRCTL_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/syscall.h> header file. */
+#undef HAVE_SYS_SYSCALL_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* <sys/ucontext.h> is broken on redhat 7 */
+#undef HAVE_SYS_UCONTEXT_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if compiler supports __thread */
+#undef HAVE_TLS
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+#undef HAVE_UCONTEXT_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <unwind.h> header file. */
+#undef HAVE_UNWIND_H
+
+/* define if your compiler has __attribute__ */
+#undef HAVE___ATTRIBUTE__
+
+/* Define to 1 if compiler supports __environ */
+#undef HAVE___ENVIRON
+
+/* Define to 1 if the system has the type `__int64'. */
+#define HAVE___INT64 1
+
+/* prefix where we look for installed files */
+#undef INSTALL_PREFIX
+
+/* Define to 1 if int32_t is equivalent to intptr_t */
+#undef INT32_EQUALS_INTPTR
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* How to access the PC from a struct ucontext */
+#undef PC_FROM_UCONTEXT
+
+/* Always the empty-string on non-windows systems. On windows, should be
+   "__declspec(dllexport)". This way, when we compile the dll, we export our
+   functions/classes. It's safe to define this here because config.h is only
+   used internally, to compile the DLL, and every DLL source file #includes
+   "config.h" before anything else. */
+#ifndef PERFTOOLS_DLL_DECL
+#define PERFTOOLS_IS_A_DLL 1 /* not set if you're statically linking */
+#define PERFTOOLS_DLL_DECL __declspec(dllexport)
+#define PERFTOOLS_DLL_DECL_FOR_UNITTESTS __declspec(dllimport)
+#endif
+
+/* printf format code for printing a size_t and ssize_t */
+#define PRIdS "Id"
+
+/* printf format code for printing a size_t and ssize_t */
+#define PRIuS "Iu"
+
+/* printf format code for printing a size_t and ssize_t */
+#define PRIxS "Ix"
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* the namespace where STL code like vector<> is defined */
+#define STL_NAMESPACE std
+
+/* Version number of package */
+#undef VERSION
+
+/* C99 says: define this to get the PRI... macros from stdint.h */
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS 1
+#endif
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+// ---------------------------------------------------------------------
+// Extra stuff not found in config.h.in
+
+// This must be defined before the windows.h is included.  We need at
+// least 0x0400 for mutex.h to have access to TryLock, and at least
+// 0x0501 for patch_functions.cc to have access to GetModuleHandleEx.
+// (This latter is an optimization we could take out if need be.)
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0501
+#endif
+
+// We want to make sure not to ever try to #include heap-checker.h
+#define NO_HEAP_CHECK 1
+
+// TODO(csilvers): include windows/port.h in every relevant source file instead?
+#include "windows/port.h"
+
+#endif /* GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_ */
diff --git a/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h b/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h
new file mode 100644
index 0000000..78b49d5
--- /dev/null
+++ b/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h
@@ -0,0 +1,183 @@
+// -*- Mode: C; c-basic-offset: 2; indent-tabs-mode: nil -*-
+/* Copyright (c) 2003, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---
+ * Author: Sanjay Ghemawat <opensource@google.com>
+ *         .h file by Craig Silverstein <opensource@google.com>
+ */
+
+#ifndef TCMALLOC_TCMALLOC_H_
+#define TCMALLOC_TCMALLOC_H_
+
+#include <stddef.h> /* for size_t */
+#ifdef __cplusplus
+#include <new> /* for std::nothrow_t, std::align_val_t */
+#endif
+
+/* Define the version number so folks can check against it */
+#define TC_VERSION_MAJOR 2
+#define TC_VERSION_MINOR 7
+#define TC_VERSION_PATCH ""
+#define TC_VERSION_STRING "gperftools 2.7"
+
+/* For struct mallinfo, if it's defined. */
+#if HAVE_STRUCT_MALLINFO
+#include <malloc.h>
+#endif
+
+#ifndef PERFTOOLS_NOTHROW
+
+#if __cplusplus >= 201103L
+#define PERFTOOLS_NOTHROW noexcept
+#elif defined(__cplusplus)
+#define PERFTOOLS_NOTHROW throw()
+#else
+#ifdef __GNUC__
+#define PERFTOOLS_NOTHROW __attribute__((__nothrow__))
+#else
+#define PERFTOOLS_NOTHROW
+#endif
+#endif
+
+#endif
+
+#ifndef PERFTOOLS_DLL_DECL
+#ifdef _WIN32
+#define PERFTOOLS_DLL_DECL __declspec(dllimport)
+#else
+#define PERFTOOLS_DLL_DECL
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Returns a human-readable version string.  If major, minor,
+ * and/or patch are not NULL, they are set to the major version,
+ * minor version, and patch-code (a string, usually "").
+ */
+PERFTOOLS_DLL_DECL const char* tc_version(int* major,
+                                          int* minor,
+                                          const char** patch) PERFTOOLS_NOTHROW;
+
+PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_free(void* ptr) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_free_sized(void* ptr, size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_cfree(void* ptr) PERFTOOLS_NOTHROW;
+
+PERFTOOLS_DLL_DECL void* tc_memalign(size_t __alignment,
+                                     size_t __size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL int tc_posix_memalign(void** ptr,
+                                         size_t align,
+                                         size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_valloc(size_t __size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_pvalloc(size_t __size) PERFTOOLS_NOTHROW;
+
+PERFTOOLS_DLL_DECL void tc_malloc_stats(void) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL int tc_mallopt(int cmd, int value) PERFTOOLS_NOTHROW;
+#if HAVE_STRUCT_MALLINFO
+PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHROW;
+#endif
+
+/*
+ * This is an alias for MallocExtension::instance()->GetAllocatedSize().
+ * It is equivalent to
+ *    OS X: malloc_size()
+ *    glibc: malloc_usable_size()
+ *    Windows: _msize()
+ */
+PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) PERFTOOLS_NOTHROW;
+
+#ifdef __cplusplus
+PERFTOOLS_DLL_DECL int tc_set_new_mode(int flag) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_new(size_t size);
+PERFTOOLS_DLL_DECL void* tc_new_nothrow(size_t size, const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_delete(void* p) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_delete_sized(void* p, size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_delete_nothrow(void* p, const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_newarray(size_t size);
+PERFTOOLS_DLL_DECL void* tc_newarray_nothrow(size_t size, const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_deletearray(void* p) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_deletearray_sized(void* p,
+                                             size_t size) PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_deletearray_nothrow(void* p, const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+
+#if 1 && __cplusplus >= 201703L
+PERFTOOLS_DLL_DECL void* tc_new_aligned(size_t size, std::align_val_t al);
+PERFTOOLS_DLL_DECL void* tc_new_aligned_nothrow(size_t size,
+                                                std::align_val_t al,
+                                                const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_delete_aligned(void* p, std::align_val_t al)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_delete_sized_aligned(void* p,
+                                                size_t size,
+                                                std::align_val_t al)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_delete_aligned_nothrow(void* p,
+                                                  std::align_val_t al,
+                                                  const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void* tc_newarray_aligned(size_t size, std::align_val_t al);
+PERFTOOLS_DLL_DECL void* tc_newarray_aligned_nothrow(size_t size,
+                                                     std::align_val_t al,
+                                                     const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_deletearray_aligned(void* p, std::align_val_t al)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_deletearray_sized_aligned(void* p,
+                                                     size_t size,
+                                                     std::align_val_t al)
+    PERFTOOLS_NOTHROW;
+PERFTOOLS_DLL_DECL void tc_deletearray_aligned_nothrow(void* p,
+                                                       std::align_val_t al,
+                                                       const std::nothrow_t&)
+    PERFTOOLS_NOTHROW;
+#endif
+}
+#endif
+
+/* We're only un-defining for public */
+#if !defined(GPERFTOOLS_CONFIG_H_)
+
+#undef PERFTOOLS_NOTHROW
+
+#endif /* GPERFTOOLS_CONFIG_H_ */
+
+#endif /* #ifndef TCMALLOC_TCMALLOC_H_ */
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids
index 39f2fbb..7adeec49 100644
--- a/tools/gritsettings/resource_ids
+++ b/tools/gritsettings/resource_ids
@@ -81,7 +81,7 @@
   # START chrome/browser section.
   "chrome/browser/browser_resources.grd": {
     "includes": [11000],
-    "structures": [11480],
+    "structures": [11485],
   },
   "chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_resources.grd": {
     "structures": [11525],
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 684e54f..03e4e76 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -24,11 +24,6 @@
     # generated publicly advertised non-Official builds which are not allowed
     # to have proprietary codecs enabled.
     'chromium': {
-      'Android': 'android_without_codecs_release_bot_minimal_symbols',
-      'Linux x64': 'release_bot',
-      'Mac': 'release_bot_mac_strip',
-      'Win': 'release_bot_x86_minimal_symbols_enable_archive_compression',
-      'Win x64': 'release_bot_minimal_symbols_enable_archive_compression',
       'android-rel': 'android_without_codecs_release_bot_minimal_symbols',
       'linux-rel': 'release_bot',
       'mac-rel': 'release_bot_mac_strip',
@@ -127,7 +122,7 @@
       'ToTLinuxASan': 'clang_tot_asan_lsan_static_release',
       'ToTLinuxASanLibfuzzer': 'libfuzzer_asan_clang_tot_release',
       'ToTLinuxMSan': 'clang_tot_msan_release',
-      'ToTLinuxThinLTO': 'clang_tot_release_minimal_symbols_thin_lto_static_use_lld',
+      'ToTLinuxThinLTO': 'clang_tot_release_minimal_symbols_thin_lto_static',
       'ToTLinuxUBSanVptr': 'clang_tot_edge_ubsan_no_recover_hack_static_release',
       'ToTMac': 'clang_tot_minimal_symbols_shared_release',
       'ToTMacCoverage': 'clang_tot_coverage_minimal_symbols_shared_release',
@@ -142,7 +137,7 @@
       'ToTWinCFI': 'clang_tot_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on_x86',
       'ToTWinCFI64': 'clang_tot_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on',
       'ToTWinLibcxx64': 'clang_tot_official_optimize_minimal_symbols_static_release_libcxx',
-      'ToTWinThinLTO64': 'clang_tot_official_full_symbols_thin_lto_static_use_lld',
+      'ToTWinThinLTO64': 'clang_tot_official_full_symbols_thin_lto_static',
       'ToTiOS': 'ios',
       'UBSanVptr Linux': 'ubsan_vptr_release_bot',
     },
@@ -1123,8 +1118,8 @@
       'clang_tot', 'minimal_symbols', 'shared', 'release', 'x86', 'dcheck_always_on',
     ],
 
-    'clang_tot_official_full_symbols_thin_lto_static_use_lld': [
-      'clang_tot', 'official', 'full_symbols', 'thin_lto', 'static', 'use_lld',
+    'clang_tot_official_full_symbols_thin_lto_static': [
+      'clang_tot', 'official', 'full_symbols', 'thin_lto', 'static',
     ],
 
     'clang_tot_official_minimal_symbols_static_release': [
@@ -1139,8 +1134,8 @@
       'clang_tot', 'official_optimize', 'minimal_symbols', 'static', 'release', 'libcxx',
     ],
 
-    'clang_tot_release_minimal_symbols_thin_lto_static_use_lld': [
-      'clang_tot', 'release', 'minimal_symbols', 'thin_lto', 'static', 'use_lld',
+    'clang_tot_release_minimal_symbols_thin_lto_static': [
+      'clang_tot', 'release', 'minimal_symbols', 'thin_lto', 'static',
     ],
 
     'clang_tot_shared_debug': [
@@ -2059,10 +2054,6 @@
       'gn_args': 'is_ubsan_vptr=true',
     },
 
-    'use_lld': {
-      'gn_args': 'use_lld=true',
-    },
-
     'no_lld': {
       'gn_args': 'use_lld=false',
     },
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index b447acc..77abf41 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -6886,6 +6886,12 @@
   <int value="2" label="Will use composited scrolling"/>
 </enum>
 
+<enum name="CompositorFrameSinkSubmitResult">
+  <int value="0" label="Accepted"/>
+  <int value="1" label="CopyOutputResults not allowed"/>
+  <int value="2" label="Surface Invariants Violation"/>
+</enum>
+
 <enum name="CompositorScrollResult">
   <int value="0" label="ScrollOnMainThread"/>
   <int value="1" label="ScrollStarted"/>
@@ -38362,6 +38368,26 @@
   <int value="4" label="More than two ports exist"/>
 </enum>
 
+<enum name="PowerMLPreviousEventLoggingResult">
+  <int value="0" label="Success">Previous event was logged successfully.</int>
+  <int value="1" label="Error">Previous event was not logged successfully.</int>
+  <int value="2" label="ErrorModelPredictionMissing">
+    Previous event was not logged successfully because model was enabled but
+    there was no prediction for the previous event.
+  </int>
+  <int value="3" label="ErrorModelDisabled">
+    Previous event was not logged successfully because model was disabled.
+  </int>
+  <int value="4" label="ErrorMultiplePreviousEvents">
+    Previous event was not logged successfully because of multiple previous
+    events.
+  </int>
+  <int value="5" label="ErrorIdleStartMissing">
+    Previous event was not logged successfully because previous idle event had
+    no event start time.
+  </int>
+</enum>
+
 <enum name="PowerSupplyType">
   <summary>
     The type of power supply connected to a Chrome OS system, as reported by the
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 1b38927d..16fbb6ec 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -642,17 +642,6 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.Clicked.HrefEngagementScore2"
-    units="score">
-  <owner>chelu@chromium.org</owner>
-  <owner>tbansal@chromium.org</owner>
-  <summary>
-    The site engagement score of the target link (href) of an anchor element.
-    The score is retrieved from the site engagement service. This histogram is
-    recorded when the anchor element is clicked.
-  </summary>
-</histogram>
-
 <histogram name="AnchorElementMetrics.Clicked.HrefEngagementScorePositive"
     units="score">
   <owner>chelu@chromium.org</owner>
@@ -776,7 +765,7 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.ContainsImage" enum="Boolean">
+<histogram base="true" name="AnchorElementMetrics.ContainsImage" enum="Boolean">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -784,7 +773,8 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.DocumentEngagementScore" units="score">
+<histogram base="true" name="AnchorElementMetrics.DocumentEngagementScore"
+    units="score">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -793,7 +783,17 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.IsInIFrame" enum="Boolean">
+<histogram base="true" name="AnchorElementMetrics.HrefEngagementScore2"
+    units="score">
+  <owner>chelu@chromium.org</owner>
+  <owner>tbansal@chromium.org</owner>
+  <summary>
+    The site engagement score of the target link (href) of an anchor element.
+    The score is retrieved from the site engagement service.
+  </summary>
+</histogram>
+
+<histogram base="true" name="AnchorElementMetrics.IsInIFrame" enum="Boolean">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -801,7 +801,7 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.IsSameHost" enum="Boolean">
+<histogram base="true" name="AnchorElementMetrics.IsSameHost" enum="Boolean">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -810,7 +810,8 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.IsUrlIncrementedByOne" enum="Boolean">
+<histogram base="true" name="AnchorElementMetrics.IsUrlIncrementedByOne"
+    enum="Boolean">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -820,7 +821,7 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.RatioArea" units="%">
+<histogram base="true" name="AnchorElementMetrics.RatioArea" units="%">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -829,8 +830,8 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.RatioDistanceCenterToVisibleTop"
-    units="%">
+<histogram base="true"
+    name="AnchorElementMetrics.RatioDistanceCenterToVisibleTop" units="%">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -840,7 +841,8 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.RatioDistanceRootBottom" units="%">
+<histogram base="true" name="AnchorElementMetrics.RatioDistanceRootBottom"
+    units="%">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -850,7 +852,8 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.RatioDistanceRootTop" units="%">
+<histogram base="true" name="AnchorElementMetrics.RatioDistanceRootTop"
+    units="%">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -860,7 +863,8 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.RatioDistanceTopToVisibleTop" units="%">
+<histogram base="true" name="AnchorElementMetrics.RatioDistanceTopToVisibleTop"
+    units="%">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -870,7 +874,7 @@
   </summary>
 </histogram>
 
-<histogram name="AnchorElementMetrics.RatioVisibleArea" units="%">
+<histogram base="true" name="AnchorElementMetrics.RatioVisibleArea" units="%">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -12660,6 +12664,18 @@
   </summary>
 </histogram>
 
+<histogram name="Compositing.CompositorFrameSinkSupport.SubmitResult"
+    enum="CompositorFrameSinkSubmitResult">
+  <owner>fsamuel@chromium.org</owner>
+  <summary>
+    The result of submitting a CompositorFrame to a CompositorFrameSink.
+    ACCEPTED means the frame was accepted by the CompositorFrameSink.
+    COPY_OUTPUT_REQUESTS_NOT_ALLOWED means an unprivileged client attempted to
+    readback a texture. SURFACE_INVARIANTS_VIOLATION means size or device scale
+    factor changed but a new viz::LocalSurfaceId was not allocated.
+  </summary>
+</histogram>
+
 <histogram name="Compositing.CopyFromSurfaceTime" units="ms"
     expires_after="2018-08-30">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -64532,6 +64548,15 @@
   </summary>
 </histogram>
 
+<histogram name="OfflinePages.PublishArchive.CreateDirectoryError"
+    enum="PlatformFileError">
+  <owner>petewil@chromium.org</owner>
+  <summary>
+    When publishing an archive, we create the download directory if it doesn't
+    already exist.  If we get an error, we record it here.
+  </summary>
+</histogram>
+
 <histogram name="OfflinePages.PublishArchive.MoveFileError"
     enum="PopularOSErrno">
   <owner>petewil@chromium.org</owner>
@@ -64562,9 +64587,7 @@
     enum="OfflinePagesSavePageResult">
   <owner>petewil@chromium.org</owner>
   <summary>
-    Result of publishing downloaded page. CANCELLED means the page to publish
-    isn't found. ALREADY_EXISTS means the page have already been published
-    before.
+    Failure attempting to move a file while publishing downloaded page.
   </summary>
 </histogram>
 
@@ -76050,6 +76073,15 @@
   </summary>
 </histogram>
 
+<histogram name="PowerML.PreviousEventLogging.Result"
+    enum="PowerMLPreviousEventLoggingResult">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    Status of logging previous idle event after a screen dim imminent signal is
+    received.
+  </summary>
+</histogram>
+
 <histogram name="Precache.BatteryPercentage.Start" units="%">
   <obsolete>
     Deprecated July 11 2017.
@@ -99258,8 +99290,9 @@
     Records the ruleset verification status at some point in a browsing session.
     If AdTagging is disabled, this happens when the user first visits a site
     that is failing the Better Ads Standard, and gets ads blocked on that site;
-    if AdTagging is enabled, this happens immediately on startup. Note that
-    subsequent failures will not be logged.
+    if AdTagging is enabled, this happens immediately on startup. Note that this
+    is recorded only once per browsing session (the lifetime of the browser
+    process).
   </summary>
 </histogram>
 
@@ -116010,6 +116043,7 @@
   <suffix name="Visible" label="Intersects with the viewport, on page load"/>
   <affected-histogram name="AnchorElementMetrics.ContainsImage"/>
   <affected-histogram name="AnchorElementMetrics.DocumentEngagementScore"/>
+  <affected-histogram name="AnchorElementMetrics.HrefEngagementScore2"/>
   <affected-histogram name="AnchorElementMetrics.IsInIFrame"/>
   <affected-histogram name="AnchorElementMetrics.IsSameHost"/>
   <affected-histogram name="AnchorElementMetrics.IsUrlIncrementedByOne"/>
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js
index d71ebb5..f5f03d1 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -590,7 +590,8 @@
         this.ui_.gearButtonToggleRipple,
         this.ui_.gearMenu,
         this.directoryModel_,
-        this.commandHandler_);
+        this.commandHandler_,
+        assert(this.providersModel_));
     this.selectionMenuController_ = new SelectionMenuController(
         this.ui_.selectionMenuButton,
         util.queryDecoratedElement('#file-context-menu', cr.ui.Menu));
@@ -1191,9 +1192,6 @@
         (this.dialogDom_.querySelector('#directory-tree'));
     var fakeEntriesVisible =
         this.dialogType !== DialogType.SELECT_SAVEAS_FILE;
-    var addNewServicesVisible =
-        this.dialogType === DialogType.FULL_PAGE &&
-        !chrome.extension.inIncognitoContext;
     this.navigationUma_ = new NavigationUma(assert(this.volumeManager_));
     DirectoryTree.decorate(directoryTree,
                            assert(this.directoryModel_),
@@ -1215,11 +1213,7 @@
                   sourceRestriction: this.getSourceRestriction_()
                 }) :
             null,
-        addNewServicesVisible ?
-            new NavigationModelMenuItem(
-                str('ADD_NEW_SERVICES_BUTTON_LABEL'), '#add-new-services-menu',
-                'add-new-services') :
-            null,
+        null,  // TODO(crbug.com/869252) remove this null.
         this.commandLineFlags_['disable-my-files-navigation']);
     this.setupCrostini_();
     this.ui_.initDirectoryTree(directoryTree);
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
index d9bd0298..d67f2cf9 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -2048,3 +2048,43 @@
   },
   canExecute: CommandUtil.canExecuteAlways
 });
+
+/**
+ * Opens "providers menu" to allow users to install new providers/FSPs.
+ * @type {Command}
+ */
+CommandHandler.COMMANDS_['new-service'] = /** @type {Command} */ ({
+  /**
+   * @param {!Event} event Command event.
+   * @param {!CommandHandlerDeps} fileManager CommandHandlerDeps to use.
+   */
+  execute: function(event, fileManager) {
+    const menuButton = fileManager.ui.newServiceButton;
+    // Make the button visible because showMenu positions the menu relative to
+    // to this button.
+    menuButton.hidden = false;
+
+    // Fire update event to display services that are already installed.
+    const updateEvent =
+        /** @type {MenuItemUpdateEvent} */ (new Event('update'));
+
+    // Display the menu near gearMenu, since menuButton will be hidden.
+    // The event listener (ProvidersMenu) only uses this menuButton for
+    // positioning.
+    updateEvent.menuButton = fileManager.ui.gearButton;
+    menuButton.menu.dispatchEvent(updateEvent);
+    menuButton.showMenu(false);
+
+    // Hide it back.
+    menuButton.hidden = true;
+  },
+  /**
+   * @param {!Event} event Command event.
+   * @param {!CommandHandlerDeps} fileManager CommandHandlerDeps to use.
+   */
+  canExecute: function(event, fileManager) {
+    event.canExecute =
+        (fileManager.dialogType === DialogType.FULL_PAGE &&
+         !chrome.extension.inIncognitoContext);
+  }
+});
diff --git a/ui/file_manager/file_manager/foreground/js/gear_menu_controller.js b/ui/file_manager/file_manager/foreground/js/gear_menu_controller.js
index 7205bac..7917fa06 100644
--- a/ui/file_manager/file_manager/foreground/js/gear_menu_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/gear_menu_controller.js
@@ -8,11 +8,13 @@
  * @param {!GearMenu} gearMenu
  * @param {!DirectoryModel} directoryModel
  * @param {!CommandHandler} commandHandler
+ * @param {!ProvidersModel} providersModel
  * @constructor
  * @struct
  */
 function GearMenuController(
-    gearButton, toggleRipple, gearMenu, directoryModel, commandHandler) {
+    gearButton, toggleRipple, gearMenu, directoryModel, commandHandler,
+    providersModel) {
   /**
    * @type {!FilesToggleRipple}
    * @const
@@ -41,6 +43,13 @@
    */
   this.commandHandler_ = commandHandler;
 
+  /**
+   * @type {!ProvidersModel}
+   * @const
+   * @private
+   */
+  this.providersModel_ = providersModel;
+
   gearButton.addEventListener('menushow', this.onShowGearMenu_.bind(this));
   gearButton.addEventListener('menuhide', this.onHideGearMenu_.bind(this));
   directoryModel.addEventListener(
@@ -59,6 +68,35 @@
 
   // Update view of drive-related settings.
   this.commandHandler_.updateAvailability();
+
+  this.updateNewServiceItem();
+};
+
+/**
+ * Update "New service" menu item to either directly show the Webstore dialog
+ * when there isn't any service/FSP extension installed, or display the
+ * providers menu with the currently installed extensions and also install new
+ * service.
+ *
+ * @private
+ */
+GearMenuController.prototype.updateNewServiceItem = function() {
+  this.providersModel_.getMountableProviders().then(providers => {
+    // Go straight to webstore to install the first provider.
+    let desiredMenu = '#install-new-extension';
+    let label = str('INSTALL_NEW_EXTENSION_LABEL');
+
+    const shouldDisplayProvidersMenu = providers.length > 0;
+    if (shouldDisplayProvidersMenu) {
+      // Open the providers menu with an installed provider and an install new
+      // provider option.
+      desiredMenu = '#new-service';
+      label = str('ADD_NEW_SERVICES_BUTTON_LABEL');
+    }
+
+    this.gearMenu_.setNewServiceCommand(desiredMenu, label);
+  });
+
 };
 
 /**
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
index 1b203fc..bade340 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
@@ -220,6 +220,14 @@
       '#gear-button', cr.ui.MenuButton);
 
   /**
+   * The button to add new service (file system providers).
+   * @type {!cr.ui.MenuButton}
+   * @const
+   */
+  this.newServiceButton =
+      util.queryDecoratedElement('#new-service-button', cr.ui.MenuButton);
+
+  /**
    * Ripple effect of gear button.
    * @type {!FilesToggleRipple}
    * @const
diff --git a/ui/file_manager/file_manager/foreground/js/ui/gear_menu.js b/ui/file_manager/file_manager/foreground/js/ui/gear_menu.js
index 4054ae3..fb00365 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/gear_menu.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/gear_menu.js
@@ -62,6 +62,14 @@
       HTMLElement);
 
   /**
+   * @type {!HTMLElement}
+   * @const
+   * @private
+   */
+  this.newServiceMenuItem_ =
+      queryRequiredElement('#gear-menu-newservice', element);
+
+  /**
    * Volume space info.
    * @type {Promise<chrome.fileManagerPrivate.MountPointSizeStats>}
    * @private
@@ -74,6 +82,20 @@
 }
 
 /**
+ * @param {!string} commandId Element id of the command that new service menu
+ *     should trigger.
+ * @param {!string} label Text that should be displayed to user in the menu.
+ */
+GearMenu.prototype.setNewServiceCommand = function(commandId, label) {
+  this.newServiceMenuItem_.textContent = label;
+  // Only change command if needed because it does some parsing when setting.
+  if ('#' + this.newServiceMenuItem_.command.id === commandId) {
+    return;
+  }
+  this.newServiceMenuItem_.command = commandId;
+};
+
+/**
  * @param {Promise<chrome.fileManagerPrivate.MountPointSizeStats>}
  * spaceInfoPromise Promise to be fulfilled with space info.
  * @param {boolean} showLoadingCaption Whether show loading caption or not.
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html
index 6b26cf5..45bbcd6 100644
--- a/ui/file_manager/file_manager/main.html
+++ b/ui/file_manager/file_manager/main.html
@@ -111,6 +111,8 @@
                shortcut="e|Ctrl">
       <command id="new-window" i18n-values="label:NEW_WINDOW_BUTTON_LABEL"
                shortcut="n|Ctrl">
+      <command id="new-service" i18n-values="label:INSTALL_NEW_EXTENSION_LABEL">
+      </command>
       <!-- Note that actual shortcut Ctrl/Meta+A is handled in
                ListSelectionController.handleKeyDown -->
       <command id="select-all"
@@ -274,6 +276,7 @@
       <cr-menu-item id="gear-menu-volume-help"
                     command="#volume-help"></cr-menu-item>
       <hr id="volume-space-info-separator">
+      <cr-menu-item id="gear-menu-newservice" command="#new-service"></cr-menu-item>
       <cr-menu-item id="volume-space-info" command="#volume-storage">
         <div id="volume-space-info-contents">
           <span id="volume-space-info-label"></span>
@@ -402,6 +405,9 @@
           <files-toggle-ripple></files-toggle-ripple>
           <div class="icon"></div>
         </button>
+        <button id="new-service-button" class="icon-button menu-button"
+                menu="#add-new-services-menu" hidden>
+        </button>
         <button id="selection-menu-button" class="icon-button menu-button" tabindex="19"
                 menu="#file-context-menu"
                 i18n-values="aria-label:SELECTION_MENU_BUTTON_TOOLTIP"
diff --git a/ui/file_manager/file_manager/test/js/strings.js b/ui/file_manager/file_manager/test/js/strings.js
index 56fc7d5..f866e02 100644
--- a/ui/file_manager/file_manager/test/js/strings.js
+++ b/ui/file_manager/file_manager/test/js/strings.js
@@ -58,7 +58,7 @@
           'devices/goodies.html?utm_source=filesapp&utm_medium=banner&' +
           'utm_campaign=gsg',
       IMAGE_FILE_TYPE: '$1 image',
-      INSTALL_NEW_EXTENSION_LABEL: 'Install new from the webstore',
+      INSTALL_NEW_EXTENSION_LABEL: 'Install new service',
       LINUX_FILES_ROOT_LABEL: 'Linux files',
       MANY_ENTRIES_SELECTED: '$1 items selected',
       MANY_FILES_SELECTED: '$1 files selected',
diff --git a/ui/file_manager/integration_tests/file_manager/my_files.js b/ui/file_manager/integration_tests/file_manager/my_files.js
index 6f039150..8758c815 100644
--- a/ui/file_manager/integration_tests/file_manager/my_files.js
+++ b/ui/file_manager/integration_tests/file_manager/my_files.js
@@ -17,7 +17,6 @@
     'My Drive: SubDirectoryItem',
     'Shared with me: SubDirectoryItem',
     'Offline: SubDirectoryItem',
-    'Add new services: MenuItem',
   ];
 
   StepsRunner.run([
diff --git a/ui/file_manager/integration_tests/file_manager/providers.js b/ui/file_manager/integration_tests/file_manager/providers.js
index e9462558..a4b2cf6 100644
--- a/ui/file_manager/integration_tests/file_manager/providers.js
+++ b/ui/file_manager/integration_tests/file_manager/providers.js
@@ -7,6 +7,11 @@
 (function() {
 
 /**
+ * Files app windowId.
+ */
+var appId;
+
+/**
  * Returns provider name of the given testing provider manifest viz., the
  * the value of the name field in the |manifest| file.
  * @param {string} manifest Testing provider manifest file name.
@@ -25,8 +30,6 @@
   throw new Error('unknown mainfest: '.concat(manifest));
 }
 
-var appId;
-
 /**
  * Returns steps for initializing test cases.
  * @param {string} manifest The manifest name of testing provider extension
@@ -53,18 +56,51 @@
 }
 
 /**
+ * Returns steps for clicking on the "gear menu".
+ * @return {!Array<function>}
+ */
+function clickGearMenu() {
+  const newServiceMenuItem = '#gear-menu-newservice:not([hidden])';
+  return [
+    // Open the gear menu by clicking the gear button.
+    function() {
+      remoteCall.callRemoteTestUtil(
+          'fakeMouseClick', appId, ['#gear-button'], this.next);
+    },
+    // Wait for Add new service menu item to appear in the gear menu.
+    function(result) {
+      chrome.test.assertTrue(!!result, 'fakeMouseClick failed');
+      remoteCall.waitForElement(appId, newServiceMenuItem).then(this.next);
+    },
+  ];
+}
+
+/**
  * Returns steps for clicking on the "Add new services" menu button.
  * @return {!Array<function>}
  */
-function getClickMenuSteps() {
+function showProvidersMenuSteps() {
+  const newServiceMenuItem = '#gear-menu-newservice:not([hidden])';
   return [
+    // Open the gear menu by clicking the gear button.
     function() {
       remoteCall.callRemoteTestUtil(
-          'fakeMouseClick',
-          appId,
-          ['div[menu=\'#add-new-services-menu\']'],
-          this.next);
-    }
+          'fakeMouseClick', appId, ['#gear-button'], this.next);
+    },
+    // Wait for Add new service menu item to appear.
+    function(result) {
+      chrome.test.assertTrue(!!result, 'fakeMouseClick failed');
+      remoteCall.waitForElement(appId, newServiceMenuItem).then(this.next);
+    },
+    // Click the menu item.
+    function(result) {
+      remoteCall.callRemoteTestUtil(
+          'fakeMouseClick', appId, [newServiceMenuItem], this.next);
+    },
+    function(result) {
+      chrome.test.assertTrue(!!result, 'fakeMouseClick failed');
+      this.next();
+    },
   ];
 }
 
@@ -88,7 +124,7 @@
           this.next);
     },
     function(result) {
-      chrome.test.assertTrue(result);
+      chrome.test.assertTrue(!!result, 'fakeMouseClick failed');
       remoteCall.waitForElement(
           appId,
           '.tree-row[selected] .icon[volume-type-icon="provided"]')
@@ -124,16 +160,17 @@
 
   StepsRunner.runGroups([
     getSetupSteps(manifest),
-    getClickMenuSteps(),
+    showProvidersMenuSteps(),
     [
-      function(result) {
-        chrome.test.assertTrue(result);
+      // Wait for providers menu and new service menu item to appear.
+      function() {
         remoteCall.waitForElement(
             appId,
             '#add-new-services-menu:not([hidden]) cr-menu-item:first-child ' +
                 'span')
             .then(this.next);
       },
+      // Click to install test provider.
       function(result) {
         chrome.test.assertEq(providerName, result.text);
         remoteCall.callRemoteTestUtil(
@@ -142,18 +179,26 @@
             ['#add-new-services-menu cr-menu-item:first-child span'],
             this.next);
       },
+      function(result) {
+        chrome.test.assertTrue(!!result, 'fakeMouseClick failed');
+        this.next();
+      },
     ],
     getConfirmVolumeSteps(false /* ejectExpected */),
-    getClickMenuSteps(),
+    // If multipleMounts we display the providers menu, otherwise we display the
+    // gear menu and check the "add new service" menu item.
+    multipleMounts ? showProvidersMenuSteps() : clickGearMenu(),
     [
       function() {
-        // When multiple mounts are supported, then the first element of the
-        // menu should stay the same. Otherwise it should disappear from the
-        // list.
+        // When multiple mounts are supported, then the "new service" menu item
+        // should open the providers menu. Otherwise it should go directly to
+        // install-new-extension, however install-new-service command uses
+        // webview which doesn't work in the integration tests.
         var selector = multipleMounts ?
             '#add-new-services-menu:not([hidden]) cr-menu-item:first-child ' +
                 'span' :
-            '#add-new-services-menu:not([hidden]) hr:first-child';
+            '#gear-menu:not([hidden]) ' +
+                'cr-menu-item[command="#install-new-extension"]';
         remoteCall.waitForElement(
             appId,
             selector)
@@ -179,19 +224,18 @@
   StepsRunner.runGroups([
     getSetupSteps(manifest),
     getConfirmVolumeSteps(true /* ejectExpected */),
-    getClickMenuSteps(),
+    clickGearMenu(),
     [
-      function(result) {
-        chrome.test.assertTrue(result);
-        // Confirm that it doesn't show up in the menu.
-        remoteCall.waitForElement(
-            appId,
-            '#add-new-services-menu:not([hidden]) hr:first-child')
-            .then(this.next);
+      function(element) {
+        // clickGearMenu returns the "Add new service" menu item.
+        // Here we only check these attributes because the menu item calls
+        // Webstore using webview which doesn't work in the integration test.
+        chrome.test.assertEq('Install new service', element.text);
+        chrome.test.assertEq(
+            '#install-new-extension', element.attributes.command);
+        this.next();
       },
-    ],
-    [
-      function(result) {
+      function() {
         checkIfNoErrorsOccured(this.next);
       }
     ]
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index 6db737e..68df8fa 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -38,6 +38,8 @@
     "gpu/drm_device_manager.h",
     "gpu/drm_display.cc",
     "gpu/drm_display.h",
+    "gpu/drm_framebuffer.cc",
+    "gpu/drm_framebuffer.h",
     "gpu/drm_gpu_display_manager.cc",
     "gpu/drm_gpu_display_manager.h",
     "gpu/drm_gpu_util.cc",
@@ -186,8 +188,6 @@
     "gpu/mock_drm_device.h",
     "gpu/mock_dumb_buffer_generator.cc",
     "gpu/mock_dumb_buffer_generator.h",
-    "gpu/mock_drm_framebuffer.cc",
-    "gpu/mock_drm_framebuffer.h",
     "gpu/mock_drm_framebuffer_generator.cc",
     "gpu/mock_drm_framebuffer_generator.h",
     "gpu/proxy_helpers_unittest.cc",
diff --git a/ui/ozone/platform/drm/gpu/crtc_controller.cc b/ui/ozone/platform/drm/gpu/crtc_controller.cc
index 75a4d2d..3c0dc26 100644
--- a/ui/ozone/platform/drm/gpu/crtc_controller.cc
+++ b/ui/ozone/platform/drm/gpu/crtc_controller.cc
@@ -33,18 +33,18 @@
       }
     }
 
-    SetCursor(nullptr);
+    DisableCursor();
     drm_->DisableCrtc(crtc_);
   }
 }
 
 bool CrtcController::Modeset(const DrmOverlayPlane& plane,
                              drmModeModeInfo mode) {
-  if (!drm_->SetCrtc(crtc_, plane.buffer->GetOpaqueFramebufferId(),
+  if (!drm_->SetCrtc(crtc_, plane.buffer->opaque_framebuffer_id(),
                      std::vector<uint32_t>(1, connector_), &mode)) {
     PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_
                 << " connector=" << connector_
-                << " framebuffer_id=" << plane.buffer->GetOpaqueFramebufferId()
+                << " framebuffer_id=" << plane.buffer->opaque_framebuffer_id()
                 << " mode=" << mode.hdisplay << "x" << mode.vdisplay << "@"
                 << mode.vrefresh;
     return false;
@@ -53,8 +53,6 @@
   mode_ = mode;
   is_disabled_ = false;
 
-  ResetCursor();
-
   return true;
 }
 
@@ -63,6 +61,7 @@
     return true;
 
   is_disabled_ = true;
+  DisableCursor();
   return drm_->DisableCrtc(crtc_);
 }
 
@@ -74,7 +73,7 @@
   if (primary && !drm_->plane_manager()->ValidatePrimarySize(*primary, mode_)) {
     VLOG(2) << "Trying to pageflip a buffer with the wrong size. Expected "
             << mode_.hdisplay << "x" << mode_.vdisplay << " got "
-            << primary->buffer->GetSize().ToString() << " for"
+            << primary->buffer->size().ToString() << " for"
             << " crtc=" << crtc_ << " connector=" << connector_;
     return true;
   }
@@ -92,35 +91,27 @@
   return drm_->plane_manager()->GetFormatModifiers(crtc_, format);
 }
 
-bool CrtcController::SetCursor(const scoped_refptr<DrmBuffer>& buffer) {
-  DCHECK(!is_disabled_ || !buffer);
-  cursor_buffer_ = buffer;
-
-  return ResetCursor();
-}
-
-bool CrtcController::MoveCursor(const gfx::Point& location) {
-  DCHECK(!is_disabled_);
-  return drm_->MoveCursor(crtc_, location);
-}
-
-bool CrtcController::ResetCursor() {
-  uint32_t handle = 0;
-  gfx::Size size;
-
-  if (cursor_buffer_) {
-    handle = cursor_buffer_->GetHandle();
-    size = cursor_buffer_->GetSize();
-  }
-
-  bool status = drm_->SetCursor(crtc_, handle, size);
-  if (!status) {
+void CrtcController::SetCursor(uint32_t handle, const gfx::Size& size) {
+  if (is_disabled_)
+    return;
+  if (!drm_->SetCursor(crtc_, handle, size)) {
     PLOG(ERROR) << "drmModeSetCursor: device " << drm_->device_path().value()
                 << " crtc " << crtc_ << " handle " << handle << " size "
                 << size.ToString();
   }
+}
 
-  return status;
+void CrtcController::MoveCursor(const gfx::Point& location) {
+  if (is_disabled_)
+    return;
+  drm_->MoveCursor(crtc_, location);
+}
+
+void CrtcController::DisableCursor() {
+  if (!drm_->SetCursor(crtc_, 0, gfx::Size())) {
+    PLOG(ERROR) << "drmModeSetCursor: device " << drm_->device_path().value()
+                << " crtc " << crtc_ << " disable";
+  }
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/crtc_controller.h b/ui/ozone/platform/drm/gpu/crtc_controller.h
index 13879b5..b016261 100644
--- a/ui/ozone/platform/drm/gpu/crtc_controller.h
+++ b/ui/ozone/platform/drm/gpu/crtc_controller.h
@@ -61,18 +61,14 @@
   // gbm will pick a modifier as it allocates the bo.
   std::vector<uint64_t> GetFormatModifiers(uint32_t fourcc_format);
 
-  bool SetCursor(const scoped_refptr<DrmBuffer>& buffer);
-  bool MoveCursor(const gfx::Point& location);
+  void SetCursor(uint32_t handle, const gfx::Size& size);
+  void MoveCursor(const gfx::Point& location);
 
  private:
-  bool ResetCursor();
+  void DisableCursor();
 
   const scoped_refptr<DrmDevice> drm_;
 
-  // Buffers need to be declared first so that they are destroyed last. Needed
-  // since the controllers may reference the buffers.
-  scoped_refptr<DrmBuffer> cursor_buffer_;
-
   uint32_t crtc_;
 
   // TODO(dnicoara) Add support for hardware mirroring (multiple connectors).
diff --git a/ui/ozone/platform/drm/gpu/drm_buffer.cc b/ui/ozone/platform/drm/gpu/drm_buffer.cc
index e827bb6..e86e153 100644
--- a/ui/ozone/platform/drm/gpu/drm_buffer.cc
+++ b/ui/ozone/platform/drm/gpu/drm_buffer.cc
@@ -31,15 +31,29 @@
   }
 }
 
+scoped_refptr<DrmFramebuffer> AddFramebufferForDumbBuffer(
+    const scoped_refptr<DrmDevice>& drm,
+    uint32_t handle,
+    uint32_t stride,
+    const SkImageInfo& info) {
+  DrmFramebuffer::AddFramebufferParams params;
+  params.flags = 0;
+  params.format = GetFourCCCodeForSkColorType(info.colorType());
+  params.modifier = DRM_FORMAT_MOD_INVALID;
+  params.width = info.width();
+  params.height = info.height();
+  params.num_planes = 1;
+  params.handles[0] = handle;
+  params.strides[0] = stride;
+  return DrmFramebuffer::AddFramebuffer(drm, params);
+}
+
 }  // namespace
 
 DrmBuffer::DrmBuffer(const scoped_refptr<DrmDevice>& drm) : drm_(drm) {
 }
 
 DrmBuffer::~DrmBuffer() {
-  if (framebuffer_ && !drm_->RemoveFramebuffer(framebuffer_))
-    PLOG(ERROR) << "DrmBuffer: RemoveFramebuffer: fb " << framebuffer_;
-
   if (mmap_base_ && !drm_->UnmapDumbBuffer(mmap_base_, mmap_size_))
     PLOG(ERROR) << "DrmBuffer: UnmapDumbBuffer: handle " << handle_;
 
@@ -62,18 +76,9 @@
   }
 
   if (should_register_framebuffer) {
-    uint32_t handles[4] = {0};
-    handles[0] = handle_;
-    uint32_t strides[4] = {0};
-    strides[0] = stride_;
-    uint32_t offsets[4] = {0};
-    fb_pixel_format_ = GetFourCCCodeForSkColorType(info.colorType());
-    if (!drm_->AddFramebuffer2(info.width(), info.height(), fb_pixel_format_,
-                               handles, strides, offsets, nullptr,
-                               &framebuffer_, 0)) {
-      PLOG(ERROR) << "DrmBuffer: AddFramebuffer2: handle " << handle_;
+    framebuffer_ = AddFramebufferForDumbBuffer(drm_, handle_, stride_, info);
+    if (!framebuffer_)
       return false;
-    }
   }
 
   surface_ = SkSurface::MakeRasterDirect(info, mmap_base_, stride_);
@@ -93,32 +98,8 @@
   return handle_;
 }
 
-uint32_t DrmBuffer::GetFramebufferId() const {
-  return framebuffer_;
-}
-
-uint32_t DrmBuffer::GetFramebufferPixelFormat() const {
-  return fb_pixel_format_;
-}
-
-uint32_t DrmBuffer::GetOpaqueFramebufferId() const {
-  return framebuffer_;
-}
-
-uint32_t DrmBuffer::GetOpaqueFramebufferPixelFormat() const {
-  return fb_pixel_format_;
-}
-
-uint64_t DrmBuffer::GetFormatModifier() const {
-  return DRM_FORMAT_MOD_NONE;
-}
-
 gfx::Size DrmBuffer::GetSize() const {
   return gfx::Size(surface_->width(), surface_->height());
 }
 
-const DrmDevice* DrmBuffer::GetDrmDevice() const {
-  return drm_.get();
-}
-
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_buffer.h b/ui/ozone/platform/drm/gpu/drm_buffer.h
index 1edb2e9..ef99129e 100644
--- a/ui/ozone/platform/drm/gpu/drm_buffer.h
+++ b/ui/ozone/platform/drm/gpu/drm_buffer.h
@@ -23,9 +23,10 @@
 // Wrapper for a DRM allocated buffer. Keeps track of the native properties of
 // the buffer and wraps the pixel memory into a SkSurface which can be used to
 // draw into using Skia.
-class DrmBuffer : public DrmFramebuffer {
+class DrmBuffer {
  public:
   DrmBuffer(const scoped_refptr<DrmDevice>& drm);
+  ~DrmBuffer();
 
   // Allocates the backing pixels and wraps them in |surface_|. |info| is used
   // to describe the buffer characteristics (size, color format).
@@ -36,20 +37,15 @@
   SkCanvas* GetCanvas() const;
 
   uint32_t GetHandle() const;
+  gfx::Size GetSize() const;
 
-  // DrmFramebuffer:
-  uint32_t GetFramebufferId() const override;
-  uint32_t GetFramebufferPixelFormat() const override;
-  uint32_t GetOpaqueFramebufferId() const override;
-  uint32_t GetOpaqueFramebufferPixelFormat() const override;
-  uint64_t GetFormatModifier() const override;
-  gfx::Size GetSize() const override;
-  const DrmDevice* GetDrmDevice() const override;
+  const scoped_refptr<DrmFramebuffer>& framebuffer() const {
+    return framebuffer_;
+  }
 
  protected:
-  ~DrmBuffer() override;
-
-  scoped_refptr<DrmDevice> drm_;
+  const scoped_refptr<DrmDevice> drm_;
+  scoped_refptr<DrmFramebuffer> framebuffer_;
 
   // Length of a row of pixels.
   uint32_t stride_ = 0;
@@ -63,13 +59,6 @@
   // Size for memory mapping.
   size_t mmap_size_ = 0;
 
-  // Buffer ID used by the DRM modesettings API. This is set when the buffer is
-  // registered with the CRTC.
-  uint32_t framebuffer_ = 0;
-
-  // Pixel format of |framebuffer_|
-  uint32_t fb_pixel_format_ = 0;
-
   // Wrapper around the native pixel memory.
   sk_sp<SkSurface> surface_;
 
diff --git a/ui/ozone/platform/drm/gpu/drm_framebuffer.cc b/ui/ozone/platform/drm/gpu/drm_framebuffer.cc
new file mode 100644
index 0000000..ab2737f
--- /dev/null
+++ b/ui/ozone/platform/drm/gpu/drm_framebuffer.cc
@@ -0,0 +1,74 @@
+// 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/ozone/platform/drm/gpu/drm_framebuffer.h"
+
+#include "ui/ozone/common/linux/drm_util_linux.h"
+#include "ui/ozone/platform/drm/common/drm_util.h"
+#include "ui/ozone/platform/drm/gpu/drm_device.h"
+
+namespace ui {
+
+// static
+scoped_refptr<DrmFramebuffer> DrmFramebuffer::AddFramebuffer(
+    scoped_refptr<DrmDevice> drm_device,
+    DrmFramebuffer::AddFramebufferParams params) {
+  uint64_t modifiers[4] = {0};
+  if (params.modifier != DRM_FORMAT_MOD_INVALID) {
+    for (size_t i = 0; i < params.num_planes; ++i)
+      modifiers[i] = params.modifier;
+  }
+
+  uint32_t framebuffer_id = 0;
+  if (!drm_device->AddFramebuffer2(params.width, params.height, params.format,
+                                   params.handles, params.strides,
+                                   params.offsets, modifiers, &framebuffer_id,
+                                   params.flags)) {
+    PLOG(ERROR) << "AddFramebuffer2";
+    return nullptr;
+  }
+
+  uint32_t opaque_format = GetFourCCFormatForOpaqueFramebuffer(
+      GetBufferFormatFromFourCCFormat(params.format));
+  uint32_t opaque_framebuffer_id = 0;
+  if (opaque_format != params.format &&
+      !drm_device->AddFramebuffer2(params.width, params.height, opaque_format,
+                                   params.handles, params.strides,
+                                   params.offsets, modifiers,
+                                   &opaque_framebuffer_id, params.flags)) {
+    PLOG(ERROR) << "AddFramebuffer2";
+    drm_device->RemoveFramebuffer(framebuffer_id);
+    return nullptr;
+  }
+
+  return base::MakeRefCounted<DrmFramebuffer>(
+      std::move(drm_device), framebuffer_id, params.format,
+      opaque_framebuffer_id, opaque_format, params.modifier,
+      gfx::Size(params.width, params.height));
+}
+
+DrmFramebuffer::DrmFramebuffer(scoped_refptr<DrmDevice> drm_device,
+                               uint32_t framebuffer_id,
+                               uint32_t framebuffer_pixel_format,
+                               uint32_t opaque_framebuffer_id,
+                               uint32_t opaque_framebuffer_pixel_format,
+                               uint64_t format_modifier,
+                               const gfx::Size& size)
+    : drm_device_(std::move(drm_device)),
+      framebuffer_id_(framebuffer_id),
+      framebuffer_pixel_format_(framebuffer_pixel_format),
+      opaque_framebuffer_id_(opaque_framebuffer_id),
+      opaque_framebuffer_pixel_format_(opaque_framebuffer_pixel_format),
+      format_modifier_(format_modifier),
+      size_(size) {}
+
+DrmFramebuffer::~DrmFramebuffer() {
+  if (!drm_device_->RemoveFramebuffer(framebuffer_id_))
+    PLOG(WARNING) << "RemoveFramebuffer";
+  if (opaque_framebuffer_id_ &&
+      !drm_device_->RemoveFramebuffer(opaque_framebuffer_id_))
+    PLOG(WARNING) << "RemoveFramebuffer";
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_framebuffer.h b/ui/ozone/platform/drm/gpu/drm_framebuffer.h
index b52d3e7..c089cb3 100644
--- a/ui/ozone/platform/drm/gpu/drm_framebuffer.h
+++ b/ui/ozone/platform/drm/gpu/drm_framebuffer.h
@@ -5,6 +5,7 @@
 #ifndef UI_OZONE_PLATFORM_DRM_GPU_SCANOUT_BUFFER_H_
 #define UI_OZONE_PLATFORM_DRM_GPU_SCANOUT_BUFFER_H_
 
+#include <drm_fourcc.h>
 #include <stdint.h>
 
 #include "base/memory/ref_counted.h"
@@ -18,33 +19,73 @@
 // Abstraction for a DRM buffer that can be scanned-out of.
 class DrmFramebuffer : public base::RefCountedThreadSafe<DrmFramebuffer> {
  public:
+  struct AddFramebufferParams {
+    uint32_t flags = 0;
+    uint32_t format = DRM_FORMAT_XRGB8888;
+    uint64_t modifier = DRM_FORMAT_MOD_INVALID;
+    uint32_t width = 0;
+    uint32_t height = 0;
+    size_t num_planes = 0;
+    uint32_t handles[4] = {0};
+    uint32_t strides[4] = {0};
+    uint32_t offsets[4] = {0};
+  };
+
+  static scoped_refptr<DrmFramebuffer> AddFramebuffer(
+      scoped_refptr<DrmDevice> drm_device,
+      AddFramebufferParams params);
+
+  DrmFramebuffer(scoped_refptr<DrmDevice> drm_device,
+                 uint32_t framebuffer_id,
+                 uint32_t framebuffer_pixel_format,
+                 uint32_t opaque_framebuffer_id,
+                 uint32_t opaque_framebuffer_pixel_format,
+                 uint64_t format_modifier,
+                 const gfx::Size& size);
+
   // ID allocated by the KMS API when the buffer is registered (via the handle).
-  virtual uint32_t GetFramebufferId() const = 0;
+  uint32_t framebuffer_id() { return framebuffer_id_; }
 
   // ID allocated if the buffer is also registered with a different pixel format
   // so that it can be scheduled as an opaque buffer.
-  virtual uint32_t GetOpaqueFramebufferId() const = 0;
+  uint32_t opaque_framebuffer_id() {
+    return opaque_framebuffer_id_ ? opaque_framebuffer_id_ : framebuffer_id_;
+  }
 
   // Returns FourCC format representing the way pixel data has been encoded in
   // memory for the registered framebuffer. This can be used to check if frame
   // buffer is compatible with a given hardware plane.
-  virtual uint32_t GetFramebufferPixelFormat() const = 0;
+  uint32_t framebuffer_pixel_format() { return framebuffer_pixel_format_; }
 
   // Returns FourCC format that should be used to schedule this buffer for
   // scanout when used as an opaque buffer.
-  virtual uint32_t GetOpaqueFramebufferPixelFormat() const = 0;
+  uint32_t opaque_framebuffer_pixel_format() {
+    return opaque_framebuffer_pixel_format_;
+  }
 
   // Returns format modifier for buffer.
-  virtual uint64_t GetFormatModifier() const = 0;
+  uint64_t format_modifier() { return format_modifier_; }
 
   // Size of the buffer.
-  virtual gfx::Size GetSize() const = 0;
+  gfx::Size size() { return size_; }
 
   // Device on which the buffer was created.
-  virtual const DrmDevice* GetDrmDevice() const = 0;
+  const scoped_refptr<DrmDevice>& drm_device() const { return drm_device_; }
 
- protected:
-  virtual ~DrmFramebuffer() {}
+ private:
+  ~DrmFramebuffer();
+
+  scoped_refptr<DrmDevice> drm_device_;
+
+  uint32_t framebuffer_id_ = 0;
+  uint32_t framebuffer_pixel_format_ = 0;
+  // If |opaque_framebuffer_pixel_format_| differs from
+  // |framebuffer_pixel_format_| the following member is set to a valid fb,
+  // otherwise it is set to 0.
+  uint32_t opaque_framebuffer_id_ = 0;
+  uint32_t opaque_framebuffer_pixel_format_ = 0;
+  uint64_t format_modifier_ = 0;
+  gfx::Size size_;
 
   friend class base::RefCountedThreadSafe<DrmFramebuffer>;
 };
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_plane.cc b/ui/ozone/platform/drm/gpu/drm_overlay_plane.cc
index cf5a5fcf..558c9b30 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_plane.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_plane.cc
@@ -27,7 +27,7 @@
                                  std::unique_ptr<gfx::GpuFence> gpu_fence)
     : buffer(buffer),
       plane_transform(gfx::OVERLAY_TRANSFORM_NONE),
-      display_bounds(gfx::Point(), buffer->GetSize()),
+      display_bounds(gfx::Point(), buffer->size()),
       crop_rect(0, 0, 1, 1),
       enable_blend(false),
       gpu_fence(std::move(gpu_fence)) {}
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
index 8d4b609..300aabe 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
@@ -29,8 +29,8 @@
     std::vector<scoped_refptr<DrmFramebuffer>>* reusable_buffers) {
   // Check if we can re-use existing buffers.
   for (const auto& buffer : *reusable_buffers) {
-    if (buffer->GetFramebufferPixelFormat() == format &&
-        buffer->GetSize() == size) {
+    if (buffer->framebuffer_pixel_format() == format &&
+        buffer->size() == size) {
       return buffer;
     }
   }
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
index d25ef4a..977207d 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -22,7 +22,6 @@
 #include "ui/ozone/platform/drm/gpu/drm_window.h"
 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h"
 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
-#include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h"
 #include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.h"
 #include "ui/ozone/platform/drm/gpu/screen_manager.h"
 
@@ -62,6 +61,11 @@
 
   void AddPlane(const ui::OverlayCheck_Params& params);
 
+  scoped_refptr<ui::DrmFramebuffer> CreateBuffer() {
+    return buffer_generator_->CreateWithModifier(
+        drm_, DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE, primary_rect_.size());
+  }
+
  protected:
   struct PlaneState {
     std::vector<uint32_t> formats;
@@ -360,10 +364,8 @@
   controller->AddCrtc(
       std::unique_ptr<ui::CrtcController>(new ui::CrtcController(
           drm_.get(), kCrtcIdBase + 1, kConnectorIdBase + 1)));
-  ui::DrmOverlayPlane plane1(
-      scoped_refptr<ui::DrmFramebuffer>(
-          new ui::MockDrmFramebuffer(primary_rect_.size())),
-      nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
+
   EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode));
 
   gfx::RectF crop_rect = gfx::RectF(0, 0, 0.5, 0.5);
@@ -429,10 +431,7 @@
   controller->AddCrtc(
       std::unique_ptr<ui::CrtcController>(new ui::CrtcController(
           drm_.get(), kCrtcIdBase + 1, kConnectorIdBase + 1)));
-  ui::DrmOverlayPlane plane1(
-      scoped_refptr<ui::DrmFramebuffer>(
-          new ui::MockDrmFramebuffer(primary_rect_.size())),
-      nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode));
 
   overlay_params_.back().buffer_size = overlay_rect_.size();
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc
index b32d4da..c35d1b0 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -35,6 +35,88 @@
 
 namespace {
 
+scoped_refptr<DrmFramebuffer> AddFramebuffersForBo(
+    const scoped_refptr<GbmDevice>& gbm,
+    gbm_bo* bo,
+    uint32_t format,
+    uint64_t format_modifier) {
+  DrmFramebuffer::AddFramebufferParams params;
+  params.format = format;
+  params.modifier = format_modifier;
+  params.width = gbm_bo_get_width(bo);
+  params.height = gbm_bo_get_height(bo);
+  params.num_planes = gbm_bo_get_num_planes(bo);
+  for (size_t i = 0; i < params.num_planes; ++i) {
+    params.handles[i] = gbm_bo_get_plane_handle(bo, i).u32;
+    params.strides[i] = gbm_bo_get_plane_stride(bo, i);
+    params.offsets[i] = gbm_bo_get_plane_offset(bo, i);
+  }
+
+  // AddFramebuffer2 only considers the modifiers if addfb_flags has
+  // DRM_MODE_FB_MODIFIERS set. We only set that when we've created
+  // a bo with modifiers, otherwise, we rely on the "no modifiers"
+  // behavior doing the right thing.
+  params.flags = 0;
+  if (gbm->allow_addfb2_modifiers() &&
+      params.modifier != DRM_FORMAT_MOD_INVALID)
+    params.flags |= DRM_MODE_FB_MODIFIERS;
+
+  return DrmFramebuffer::AddFramebuffer(gbm.get(), params);
+}
+
+uint32_t BufferUsageToGbmFlags(gfx::BufferUsage usage) {
+  switch (usage) {
+    case gfx::BufferUsage::GPU_READ:
+      return GBM_BO_USE_TEXTURING;
+    case gfx::BufferUsage::SCANOUT:
+      return GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING;
+      break;
+    case gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE:
+      return GBM_BO_USE_LINEAR | GBM_BO_USE_CAMERA_WRITE | GBM_BO_USE_SCANOUT |
+             GBM_BO_USE_TEXTURING;
+      break;
+    case gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE:
+      return GBM_BO_USE_LINEAR | GBM_BO_USE_CAMERA_WRITE | GBM_BO_USE_TEXTURING;
+    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+      return GBM_BO_USE_LINEAR | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING;
+    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+      return GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING |
+             GBM_BO_USE_HW_VIDEO_DECODER;
+    case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
+    case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
+      return GBM_BO_USE_LINEAR | GBM_BO_USE_TEXTURING;
+  }
+}
+
+void CreateBufferWithGbmFlags(const scoped_refptr<GbmDevice>& gbm,
+                              uint32_t fourcc_format,
+                              const gfx::Size& size,
+                              uint32_t flags,
+                              const std::vector<uint64_t>& modifiers,
+                              std::unique_ptr<GbmBuffer>* out_buffer,
+                              scoped_refptr<DrmFramebuffer>* out_framebuffer) {
+  std::unique_ptr<GbmBuffer> buffer;
+  if (modifiers.empty())
+    buffer = GbmBuffer::CreateBuffer(gbm, fourcc_format, size, flags);
+  else
+    buffer = GbmBuffer::CreateBufferWithModifiers(gbm, fourcc_format, size,
+                                                  flags, modifiers);
+  if (!buffer)
+    return;
+
+  scoped_refptr<DrmFramebuffer> framebuffer;
+  if (flags & GBM_BO_USE_SCANOUT) {
+    framebuffer = AddFramebuffersForBo(gbm, buffer->gbm_bo()->bo(),
+                                       buffer->gbm_bo()->format(),
+                                       buffer->gbm_bo()->format_modifier());
+    if (!framebuffer)
+      return;
+  }
+
+  *out_buffer = std::move(buffer);
+  *out_framebuffer = std::move(framebuffer);
+}
+
 class GbmBufferGenerator : public DrmFramebufferGenerator {
  public:
   GbmBufferGenerator() {}
@@ -46,12 +128,21 @@
                                        const std::vector<uint64_t>& modifiers,
                                        const gfx::Size& size) override {
     scoped_refptr<GbmDevice> gbm(static_cast<GbmDevice*>(drm.get()));
+    std::unique_ptr<GbmBuffer> buffer;
+
     if (modifiers.size() > 0) {
-      return GbmBuffer::CreateBufferWithModifiers(
+      buffer = GbmBuffer::CreateBufferWithModifiers(
           gbm, format, size, GBM_BO_USE_SCANOUT, modifiers);
     } else {
-      return GbmBuffer::CreateBuffer(gbm, format, size, GBM_BO_USE_SCANOUT);
+      buffer = GbmBuffer::CreateBuffer(gbm, format, size, GBM_BO_USE_SCANOUT);
     }
+
+    if (!buffer)
+      return nullptr;
+
+    return AddFramebuffersForBo(gbm, buffer->gbm_bo()->bo(),
+                                buffer->gbm_bo()->format(),
+                                buffer->gbm_bo()->format_modifier());
   }
 
  protected:
@@ -120,66 +211,36 @@
                              gfx::BufferFormat format,
                              gfx::BufferUsage usage,
                              uint32_t client_flags,
-                             scoped_refptr<GbmBuffer>* buffer) {
+                             std::unique_ptr<GbmBuffer>* buffer,
+                             scoped_refptr<DrmFramebuffer>* framebuffer) {
   scoped_refptr<GbmDevice> gbm =
       static_cast<GbmDevice*>(device_manager_->GetDrmDevice(widget).get());
   DCHECK(gbm);
 
-  uint32_t flags = 0;
-  switch (usage) {
-    case gfx::BufferUsage::GPU_READ:
-      flags = GBM_BO_USE_TEXTURING;
-      break;
-    case gfx::BufferUsage::SCANOUT:
-      flags = GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING;
-      break;
-    case gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE:
-      flags = GBM_BO_USE_LINEAR | GBM_BO_USE_CAMERA_WRITE | GBM_BO_USE_SCANOUT |
-              GBM_BO_USE_TEXTURING;
-      break;
-    case gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE:
-      flags =
-          GBM_BO_USE_LINEAR | GBM_BO_USE_CAMERA_WRITE | GBM_BO_USE_TEXTURING;
-      break;
-    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
-      flags = GBM_BO_USE_LINEAR | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING;
-      break;
-    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
-      flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING |
-              GBM_BO_USE_HW_VIDEO_DECODER;
-      break;
-    case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
-    case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
-      flags = GBM_BO_USE_LINEAR | GBM_BO_USE_TEXTURING;
-      break;
-  }
-
   DrmWindow* window = screen_manager_->GetWindow(widget);
-  std::vector<uint64_t> modifiers;
-
+  uint32_t flags = BufferUsageToGbmFlags(usage);
   uint32_t fourcc_format = ui::GetFourCCFormatFromBufferFormat(format);
 
   // TODO(hoegsberg): We shouldn't really get here without a window,
   // but it happens during init. Need to figure out why.
-  if (window && window->GetController())
+  std::vector<uint64_t> modifiers;
+  if (window && window->GetController() && !(flags & GBM_BO_USE_LINEAR) &&
+      !(client_flags & GbmBuffer::kFlagNoModifiers)) {
     modifiers = window->GetController()->GetFormatModifiers(fourcc_format);
+  }
+
+  CreateBufferWithGbmFlags(gbm, fourcc_format, size, flags, modifiers, buffer,
+                           framebuffer);
 
   // NOTE: BufferUsage::SCANOUT is used to create buffers that will be
   // explicitly set via kms on a CRTC (e.g: BufferQueue buffers), therefore
   // allocation should fail if it's not possible to allocate a BO_USE_SCANOUT
   // buffer in that case.
-  bool retry_without_scanout = usage != gfx::BufferUsage::SCANOUT;
-  do {
-    if (modifiers.size() > 0 && !(flags & GBM_BO_USE_LINEAR) &&
-        !(client_flags & GbmBuffer::kFlagNoModifiers))
-      *buffer = GbmBuffer::CreateBufferWithModifiers(gbm, fourcc_format, size,
-                                                     flags, modifiers);
-    else
-      *buffer = GbmBuffer::CreateBuffer(gbm, fourcc_format, size, flags);
-    retry_without_scanout =
-        retry_without_scanout && !*buffer && (flags & GBM_BO_USE_SCANOUT);
+  if (!*buffer && usage != gfx::BufferUsage::SCANOUT) {
     flags &= ~GBM_BO_USE_SCANOUT;
-  } while (retry_without_scanout);
+    CreateBufferWithGbmFlags(gbm, fourcc_format, size, flags, modifiers, buffer,
+                             framebuffer);
+  }
 }
 
 void DrmThread::CreateBufferFromFds(
@@ -188,13 +249,29 @@
     gfx::BufferFormat format,
     std::vector<base::ScopedFD> fds,
     const std::vector<gfx::NativePixmapPlane>& planes,
-    scoped_refptr<GbmBuffer>* buffer) {
+    std::unique_ptr<GbmBuffer>* out_buffer,
+    scoped_refptr<DrmFramebuffer>* out_framebuffer) {
   scoped_refptr<GbmDevice> gbm =
       static_cast<GbmDevice*>(device_manager_->GetDrmDevice(widget).get());
   DCHECK(gbm);
-  *buffer = GbmBuffer::CreateBufferFromFds(
+
+  std::unique_ptr<GbmBuffer> buffer = GbmBuffer::CreateBufferFromFds(
       gbm, ui::GetFourCCFormatFromBufferFormat(format), size, std::move(fds),
       planes);
+  if (!buffer)
+    return;
+
+  scoped_refptr<DrmFramebuffer> framebuffer;
+  if (buffer->gbm_bo()->flags() & GBM_BO_USE_SCANOUT) {
+    framebuffer = AddFramebuffersForBo(gbm, buffer->gbm_bo()->bo(),
+                                       buffer->gbm_bo()->format(),
+                                       buffer->gbm_bo()->format_modifier());
+    if (!framebuffer)
+      return;
+  }
+
+  *out_buffer = std::move(buffer);
+  *out_framebuffer = std::move(framebuffer);
 }
 
 void DrmThread::GetScanoutFormats(
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.h b/ui/ozone/platform/drm/gpu/drm_thread.h
index e5fdc5069..ff964b8 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.h
+++ b/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -41,6 +41,7 @@
 namespace ui {
 
 class DrmDeviceManager;
+class DrmFramebuffer;
 class DrmGpuDisplayManager;
 class GbmBuffer;
 class DrmFramebufferGenerator;
@@ -71,13 +72,15 @@
                     gfx::BufferFormat format,
                     gfx::BufferUsage usage,
                     uint32_t flags,
-                    scoped_refptr<GbmBuffer>* buffer);
+                    std::unique_ptr<GbmBuffer>* buffer,
+                    scoped_refptr<DrmFramebuffer>* framebuffer);
   void CreateBufferFromFds(gfx::AcceleratedWidget widget,
                            const gfx::Size& size,
                            gfx::BufferFormat format,
                            std::vector<base::ScopedFD> fds,
                            const std::vector<gfx::NativePixmapPlane>& planes,
-                           scoped_refptr<GbmBuffer>* buffer);
+                           std::unique_ptr<GbmBuffer>* buffer,
+                           scoped_refptr<DrmFramebuffer>* framebuffer);
   void GetScanoutFormats(gfx::AcceleratedWidget widget,
                          std::vector<gfx::BufferFormat>* scanout_formats);
   void AddBindingCursorDevice(ozone::mojom::DeviceCursorRequest request);
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc b/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
index 3b0d2a8..4fb027dd 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
@@ -32,36 +32,34 @@
   return std::make_unique<DrmWindowProxy>(widget, &drm_thread_);
 }
 
-scoped_refptr<GbmBuffer> DrmThreadProxy::CreateBuffer(
-    gfx::AcceleratedWidget widget,
-    const gfx::Size& size,
-    gfx::BufferFormat format,
-    gfx::BufferUsage usage,
-    uint32_t flags) {
+void DrmThreadProxy::CreateBuffer(gfx::AcceleratedWidget widget,
+                                  const gfx::Size& size,
+                                  gfx::BufferFormat format,
+                                  gfx::BufferUsage usage,
+                                  uint32_t flags,
+                                  std::unique_ptr<GbmBuffer>* buffer,
+                                  scoped_refptr<DrmFramebuffer>* framebuffer) {
   DCHECK(drm_thread_.task_runner())
       << "no task runner! in DrmThreadProxy::CreateBuffer";
-  scoped_refptr<GbmBuffer> buffer;
-
   PostSyncTask(
       drm_thread_.task_runner(),
       base::BindOnce(&DrmThread::CreateBuffer, base::Unretained(&drm_thread_),
-                     widget, size, format, usage, flags, &buffer));
-  return buffer;
+                     widget, size, format, usage, flags, buffer, framebuffer));
 }
 
-scoped_refptr<GbmBuffer> DrmThreadProxy::CreateBufferFromFds(
+void DrmThreadProxy::CreateBufferFromFds(
     gfx::AcceleratedWidget widget,
     const gfx::Size& size,
     gfx::BufferFormat format,
     std::vector<base::ScopedFD> fds,
-    const std::vector<gfx::NativePixmapPlane>& planes) {
-  scoped_refptr<GbmBuffer> buffer;
-  PostSyncTask(
-      drm_thread_.task_runner(),
-      base::BindOnce(&DrmThread::CreateBufferFromFds,
-                     base::Unretained(&drm_thread_), widget, size, format,
-                     base::Passed(std::move(fds)), planes, &buffer));
-  return buffer;
+    const std::vector<gfx::NativePixmapPlane>& planes,
+    std::unique_ptr<GbmBuffer>* buffer,
+    scoped_refptr<DrmFramebuffer>* framebuffer) {
+  PostSyncTask(drm_thread_.task_runner(),
+               base::BindOnce(&DrmThread::CreateBufferFromFds,
+                              base::Unretained(&drm_thread_), widget, size,
+                              format, base::Passed(std::move(fds)), planes,
+                              buffer, framebuffer));
 }
 
 void DrmThreadProxy::GetScanoutFormats(
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_proxy.h b/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
index cef8415..3581105 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
+++ b/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
@@ -32,18 +32,21 @@
   std::unique_ptr<DrmWindowProxy> CreateDrmWindowProxy(
       gfx::AcceleratedWidget widget);
 
-  scoped_refptr<GbmBuffer> CreateBuffer(gfx::AcceleratedWidget widget,
-                                        const gfx::Size& size,
-                                        gfx::BufferFormat format,
-                                        gfx::BufferUsage usage,
-                                        uint32_t flags);
+  void CreateBuffer(gfx::AcceleratedWidget widget,
+                    const gfx::Size& size,
+                    gfx::BufferFormat format,
+                    gfx::BufferUsage usage,
+                    uint32_t flags,
+                    std::unique_ptr<GbmBuffer>* buffer,
+                    scoped_refptr<DrmFramebuffer>* framebuffer);
 
-  scoped_refptr<GbmBuffer> CreateBufferFromFds(
-      gfx::AcceleratedWidget widget,
-      const gfx::Size& size,
-      gfx::BufferFormat format,
-      std::vector<base::ScopedFD> fds,
-      const std::vector<gfx::NativePixmapPlane>& planes);
+  void CreateBufferFromFds(gfx::AcceleratedWidget widget,
+                           const gfx::Size& size,
+                           gfx::BufferFormat format,
+                           std::vector<base::ScopedFD> fds,
+                           const std::vector<gfx::NativePixmapPlane>& planes,
+                           std::unique_ptr<GbmBuffer>* buffer,
+                           scoped_refptr<DrmFramebuffer>* framebuffer);
 
   void GetScanoutFormats(gfx::AcceleratedWidget widget,
                          std::vector<gfx::BufferFormat>* scanout_formats);
diff --git a/ui/ozone/platform/drm/gpu/drm_window.cc b/ui/ozone/platform/drm/gpu/drm_window.cc
index f35e8ac..1c0dc3dc 100644
--- a/ui/ozone/platform/drm/gpu/drm_window.cc
+++ b/ui/ozone/platform/drm/gpu/drm_window.cc
@@ -26,20 +26,6 @@
 
 namespace ui {
 
-namespace {
-
-void UpdateCursorImage(DrmBuffer* cursor, const SkBitmap& image) {
-  SkRect damage;
-  image.getBounds(&damage);
-
-  // Clear to transparent in case |image| is smaller than the canvas.
-  SkCanvas* canvas = cursor->GetCanvas();
-  canvas->clear(SK_ColorTRANSPARENT);
-  canvas->drawBitmapRect(image, damage, NULL);
-}
-
-}  // namespace
-
 DrmWindow::DrmWindow(gfx::AcceleratedWidget widget,
                      DrmDeviceManager* device_manager,
                      ScreenManager* screen_manager)
@@ -97,23 +83,12 @@
         this, &DrmWindow::OnCursorAnimationTimeout);
   }
 
-  ResetCursor(false);
-}
-
-void DrmWindow::SetCursorWithoutAnimations(const std::vector<SkBitmap>& bitmaps,
-                                           const gfx::Point& location) {
-  cursor_bitmaps_ = bitmaps;
-  cursor_location_ = location;
-  cursor_frame_ = 0;
-  cursor_frame_delay_ms_ = 0;
-  ResetCursor(false);
+  ResetCursor();
 }
 
 void DrmWindow::MoveCursor(const gfx::Point& location) {
   cursor_location_ = location;
-
-  if (controller_)
-    controller_->MoveCursor(location);
+  UpdateCursorLocation();
 }
 
 void DrmWindow::SchedulePageFlip(
@@ -123,7 +98,7 @@
   if (controller_) {
     const DrmDevice* drm = controller_->GetDrmDevice().get();
     for (const auto& plane : planes) {
-      if (plane.buffer && plane.buffer->GetDrmDevice() != drm) {
+      if (plane.buffer && plane.buffer->drm_device() != drm) {
         // Although |force_buffer_reallocation_| is set to true during window
         // bounds update, this may still be needed because of in-flight buffers.
         force_buffer_reallocation_ = true;
@@ -178,31 +153,33 @@
                base::TimeDelta::FromSeconds(1) / crtc->mode().vrefresh);
 }
 
-void DrmWindow::ResetCursor(bool bitmap_only) {
+void DrmWindow::UpdateCursorImage() {
   if (!controller_)
     return;
-
   if (cursor_bitmaps_.size()) {
-    // Draw new cursor into backbuffer.
-    UpdateCursorImage(cursor_buffers_[cursor_frontbuffer_ ^ 1].get(),
-                      cursor_bitmaps_[cursor_frame_]);
-
-    // Reset location & buffer.
-    if (!bitmap_only)
-      controller_->MoveCursor(cursor_location_);
-    controller_->SetCursor(cursor_buffers_[cursor_frontbuffer_ ^ 1]);
-    cursor_frontbuffer_ ^= 1;
+    controller_->SetCursor(cursor_bitmaps_[cursor_frame_]);
   } else {
     // No cursor set.
-    controller_->UnsetCursor();
+    controller_->SetCursor(SkBitmap());
   }
 }
 
+void DrmWindow::UpdateCursorLocation() {
+  if (!controller_)
+    return;
+  controller_->MoveCursor(cursor_location_);
+}
+
+void DrmWindow::ResetCursor() {
+  UpdateCursorLocation();
+  UpdateCursorImage();
+}
+
 void DrmWindow::OnCursorAnimationTimeout() {
   cursor_frame_++;
   cursor_frame_ %= cursor_bitmaps_.size();
 
-  ResetCursor(true);
+  UpdateCursorImage();
 }
 
 void DrmWindow::SetController(HardwareDisplayController* controller) {
@@ -219,34 +196,8 @@
   device_manager_->UpdateDrmDevice(
       widget_, controller ? controller->GetDrmDevice() : nullptr);
 
-  UpdateCursorBuffers();
   // We changed displays, so we want to update the cursor as well.
-  ResetCursor(false /* bitmap_only */);
-}
-
-void DrmWindow::UpdateCursorBuffers() {
-  TRACE_EVENT0("drm", "DrmWindow::UpdateCursorBuffers");
-  if (!controller_) {
-    for (size_t i = 0; i < arraysize(cursor_buffers_); ++i) {
-      cursor_buffers_[i] = nullptr;
-    }
-  } else {
-    scoped_refptr<DrmDevice> drm = controller_->GetDrmDevice();
-    gfx::Size max_cursor_size = GetMaximumCursorSize(drm->get_fd());
-    SkImageInfo info = SkImageInfo::MakeN32Premul(max_cursor_size.width(),
-                                                  max_cursor_size.height());
-    for (size_t i = 0; i < arraysize(cursor_buffers_); ++i) {
-      cursor_buffers_[i] = new DrmBuffer(drm);
-      // Don't register a framebuffer for cursors since they are special (they
-      // aren't modesetting buffers and drivers may fail to register them due to
-      // their small sizes).
-      if (!cursor_buffers_[i]->Initialize(
-              info, false /* should_register_framebuffer */)) {
-        LOG(FATAL) << "Failed to initialize cursor buffer";
-        return;
-      }
-    }
-  }
+  ResetCursor();
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_window.h b/ui/ozone/platform/drm/gpu/drm_window.h
index e7b7c4d..236eefa0 100644
--- a/ui/ozone/platform/drm/gpu/drm_window.h
+++ b/ui/ozone/platform/drm/gpu/drm_window.h
@@ -77,11 +77,6 @@
                  const gfx::Point& location,
                  int frame_delay_ms);
 
-  // Update the HW cursor bitmap & move to specified location. If
-  // the bitmap is empty, the cursor is hidden.
-  void SetCursorWithoutAnimations(const std::vector<SkBitmap>& bitmaps,
-                                  const gfx::Point& location);
-
   // Move the HW cursor to the specified location.
   void MoveCursor(const gfx::Point& location);
 
@@ -98,16 +93,9 @@
       const gfx::VSyncProvider::UpdateVSyncCallback& callback) const;
 
  private:
-  // Draw the last set cursor & update the cursor plane.
-  void ResetCursor(bool bitmap_only);
-
   // Draw next frame in an animated cursor.
   void OnCursorAnimationTimeout();
 
-  // When |controller_| changes this is called to reallocate the cursor buffers
-  // since the allocation DRM device may have changed.
-  void UpdateCursorBuffers();
-
   gfx::AcceleratedWidget widget_;
 
   DrmDeviceManager* device_manager_;  // Not owned.
@@ -121,11 +109,13 @@
   HardwareDisplayController* controller_ = nullptr;
   std::unique_ptr<DrmOverlayValidator> overlay_validator_;
 
+  void UpdateCursorImage();
+  void UpdateCursorLocation();
+
+  // Draw the last set cursor & update the cursor plane.
+  void ResetCursor();
+
   base::RepeatingTimer cursor_timer_;
-
-  scoped_refptr<DrmBuffer> cursor_buffers_[2];
-  int cursor_frontbuffer_ = 0;
-
   std::vector<SkBitmap> cursor_bitmaps_;
   gfx::Point cursor_location_;
   int cursor_frame_ = 0;
diff --git a/ui/ozone/platform/drm/gpu/drm_window_unittest.cc b/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
index 22bc36b..fd5d379c 100644
--- a/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
@@ -45,7 +45,7 @@
     const scoped_refptr<ui::MockDrmDevice> drm) {
   std::vector<sk_sp<SkSurface>> cursor_buffers;
   for (const auto& cursor_buffer : drm->buffers()) {
-    if (cursor_buffer->width() == kDefaultCursorSize &&
+    if (cursor_buffer && cursor_buffer->width() == kDefaultCursorSize &&
         cursor_buffer->height() == kDefaultCursorSize) {
       cursor_buffers.push_back(cursor_buffer);
     }
diff --git a/ui/ozone/platform/drm/gpu/gbm_buffer.cc b/ui/ozone/platform/drm/gpu/gbm_buffer.cc
index 9c3af9d..ae80ab0 100644
--- a/ui/ozone/platform/drm/gpu/gbm_buffer.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_buffer.cc
@@ -46,88 +46,11 @@
               modifier,
               std::move(fds),
               size,
-              std::move(planes)) {
-  if (gbm_bo_.flags() & GBM_BO_USE_SCANOUT) {
-    struct gbm_bo* bo = gbm_bo_.bo();
-    DCHECK(bo);
-    framebuffer_pixel_format_ = gbm_bo_.format();
-    opaque_framebuffer_pixel_format_ = GetFourCCFormatForOpaqueFramebuffer(
-        GetBufferFormatFromFourCCFormat(framebuffer_pixel_format_));
+              std::move(planes)) {}
 
-    uint32_t handles[4] = {0};
-    uint32_t strides[4] = {0};
-    uint32_t offsets[4] = {0};
-    uint64_t modifiers[4] = {0};
+GbmBuffer::~GbmBuffer() {}
 
-    uint64_t modifier = gbm_bo_.format_modifier();
-    for (size_t i = 0; i < gbm_bo_get_num_planes(bo); ++i) {
-      handles[i] = gbm_bo_get_plane_handle(bo, i).u32;
-      strides[i] = gbm_bo_get_plane_stride(bo, i);
-      offsets[i] = gbm_bo_get_plane_offset(bo, i);
-      if (modifier != DRM_FORMAT_MOD_INVALID)
-        modifiers[i] = modifier;
-    }
-
-    // AddFramebuffer2 only considers the modifiers if addfb_flags has
-    // DRM_MODE_FB_MODIFIERS set. We only set that when we've created
-    // a bo with modifiers, otherwise, we rely on the "no modifiers"
-    // behavior doing the right thing.
-    const uint32_t addfb_flags =
-        gbm->allow_addfb2_modifiers() &&
-        modifier != DRM_FORMAT_MOD_INVALID ? DRM_MODE_FB_MODIFIERS : 0;
-    bool ret = drm_->AddFramebuffer2(
-        gbm_bo_get_width(bo), gbm_bo_get_height(bo), framebuffer_pixel_format_,
-        handles, strides, offsets, modifiers, &framebuffer_, addfb_flags);
-    PLOG_IF(ERROR, !ret) << "AddFramebuffer2 failed";
-
-    if (opaque_framebuffer_pixel_format_ != framebuffer_pixel_format_) {
-      ret = drm_->AddFramebuffer2(gbm_bo_get_width(bo), gbm_bo_get_height(bo),
-                                  opaque_framebuffer_pixel_format_, handles,
-                                  strides, offsets, modifiers,
-                                  &opaque_framebuffer_, addfb_flags);
-      PLOG_IF(ERROR, !ret) << "AddFramebuffer2 failed";
-    }
-  }
-}
-
-GbmBuffer::~GbmBuffer() {
-  if (framebuffer_)
-    drm_->RemoveFramebuffer(framebuffer_);
-  if (opaque_framebuffer_)
-    drm_->RemoveFramebuffer(opaque_framebuffer_);
-}
-
-uint32_t GbmBuffer::GetFramebufferId() const {
-  return framebuffer_;
-}
-
-uint32_t GbmBuffer::GetOpaqueFramebufferId() const {
-  return opaque_framebuffer_ ? opaque_framebuffer_ : framebuffer_;
-}
-
-uint64_t GbmBuffer::GetFormatModifier() const {
-  return gbm_bo_.format_modifier();
-}
-
-gfx::Size GbmBuffer::GetSize() const {
-  return gbm_bo_.size();
-}
-
-uint32_t GbmBuffer::GetFramebufferPixelFormat() const {
-  DCHECK(framebuffer_);
-  return framebuffer_pixel_format_;
-}
-
-uint32_t GbmBuffer::GetOpaqueFramebufferPixelFormat() const {
-  DCHECK(framebuffer_);
-  return opaque_framebuffer_pixel_format_;
-}
-
-const DrmDevice* GbmBuffer::GetDrmDevice() const {
-  return drm_.get();
-}
-
-scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferForBO(
+std::unique_ptr<GbmBuffer> GbmBuffer::CreateBufferForBO(
     const scoped_refptr<GbmDevice>& gbm,
     struct gbm_bo* bo,
     uint32_t format,
@@ -158,17 +81,12 @@
                         gbm_bo_get_plane_offset(bo, i),
                         gbm_bo_get_plane_size(bo, i), modifier);
   }
-  scoped_refptr<GbmBuffer> buffer(new GbmBuffer(gbm, bo, format, flags,
-                                                modifier, std::move(fds), size,
-                                                std::move(planes)));
-  if (flags & GBM_BO_USE_SCANOUT && !buffer->GetFramebufferId())
-    return nullptr;
-
-  return buffer;
+  return std::make_unique<GbmBuffer>(gbm, bo, format, flags, modifier,
+                                     std::move(fds), size, std::move(planes));
 }
 
 // static
-scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferWithModifiers(
+std::unique_ptr<GbmBuffer> GbmBuffer::CreateBufferWithModifiers(
     const scoped_refptr<GbmDevice>& gbm,
     uint32_t format,
     const gfx::Size& size,
@@ -187,7 +105,7 @@
 }
 
 // static
-scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer(
+std::unique_ptr<GbmBuffer> GbmBuffer::CreateBuffer(
     const scoped_refptr<GbmDevice>& gbm,
     uint32_t format,
     const gfx::Size& size,
@@ -204,7 +122,7 @@
 }
 
 // static
-scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds(
+std::unique_ptr<GbmBuffer> GbmBuffer::CreateBufferFromFds(
     const scoped_refptr<GbmDevice>& gbm,
     uint32_t format,
     const gfx::Size& size,
@@ -245,16 +163,17 @@
     }
   }
 
-  scoped_refptr<GbmBuffer> buffer(
-      new GbmBuffer(gbm, bo, format, gbm_flags, planes[0].modifier,
-                    std::move(fds), size, std::move(planes)));
-
-  return buffer;
+  return std::make_unique<GbmBuffer>(gbm, bo, format, gbm_flags,
+                                     planes[0].modifier, std::move(fds), size,
+                                     std::move(planes));
 }
 
 GbmPixmap::GbmPixmap(GbmSurfaceFactory* surface_manager,
-                     const scoped_refptr<GbmBuffer>& buffer)
-    : surface_manager_(surface_manager), buffer_(buffer) {}
+                     std::unique_ptr<GbmBuffer> buffer,
+                     scoped_refptr<DrmFramebuffer> framebuffer)
+    : surface_manager_(surface_manager),
+      buffer_(std::move(buffer)),
+      framebuffer_(std::move(framebuffer)) {}
 
 gfx::NativePixmapHandle GbmPixmap::ExportHandle() {
   gfx::NativePixmapHandle handle;
@@ -281,9 +200,6 @@
   return handle;
 }
 
-GbmPixmap::~GbmPixmap() {
-}
-
 bool GbmPixmap::AreDmaBufFdsValid() const {
   return buffer_->gbm_bo()->AreFdsValid();
 }
@@ -305,7 +221,7 @@
 }
 
 uint64_t GbmPixmap::GetDmaBufModifier(size_t plane) const {
-  return buffer_->GetFormatModifier();
+  return buffer_->gbm_bo()->format_modifier();
 }
 
 gfx::BufferFormat GbmPixmap::GetBufferFormat() const {
@@ -331,13 +247,15 @@
   // |framebuffer_id| might be 0 if AddFramebuffer2 failed, in that case we
   // already logged the error in GbmBuffer ctor. We avoid logging the error
   // here since this method might be called every pageflip.
-  if (buffer_->GetFramebufferId()) {
-    surface_manager_->GetSurface(widget)->QueueOverlayPlane(
-        DrmOverlayPlane(buffer_, plane_z_order, plane_transform, display_bounds,
-                        crop_rect, enable_blend, std::move(gpu_fence)));
+  if (framebuffer_) {
+    surface_manager_->GetSurface(widget)->QueueOverlayPlane(DrmOverlayPlane(
+        framebuffer_, plane_z_order, plane_transform, display_bounds, crop_rect,
+        enable_blend, std::move(gpu_fence)));
   }
 
   return true;
 }
 
+GbmPixmap::~GbmPixmap() {}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/gbm_buffer.h b/ui/ozone/platform/drm/gpu/gbm_buffer.h
index 0fed4676..fa50aa5 100644
--- a/ui/ozone/platform/drm/gpu/gbm_buffer.h
+++ b/ui/ozone/platform/drm/gpu/gbm_buffer.h
@@ -18,40 +18,28 @@
 class GbmDevice;
 class GbmSurfaceFactory;
 
-class GbmBuffer : public DrmFramebuffer {
+class GbmBuffer {
  public:
   static constexpr uint32_t kFlagNoModifiers = 1U << 0;
 
-  static scoped_refptr<GbmBuffer> CreateBuffer(
+  static std::unique_ptr<GbmBuffer> CreateBuffer(
       const scoped_refptr<GbmDevice>& gbm,
       uint32_t format,
       const gfx::Size& size,
       uint32_t flags);
-  static scoped_refptr<GbmBuffer> CreateBufferWithModifiers(
+  static std::unique_ptr<GbmBuffer> CreateBufferWithModifiers(
       const scoped_refptr<GbmDevice>& gbm,
       uint32_t format,
       const gfx::Size& size,
       uint32_t flags,
       const std::vector<uint64_t>& modifiers);
-  static scoped_refptr<GbmBuffer> CreateBufferFromFds(
+  static std::unique_ptr<GbmBuffer> CreateBufferFromFds(
       const scoped_refptr<GbmDevice>& gbm,
       uint32_t format,
       const gfx::Size& size,
       std::vector<base::ScopedFD> fds,
       const std::vector<gfx::NativePixmapPlane>& planes);
 
-  const GbmBoWrapper* gbm_bo() const { return &gbm_bo_; }
-
-  // DrmFramebuffer:
-  uint32_t GetFramebufferId() const override;
-  uint32_t GetOpaqueFramebufferId() const override;
-  uint32_t GetFramebufferPixelFormat() const override;
-  uint32_t GetOpaqueFramebufferPixelFormat() const override;
-  uint64_t GetFormatModifier() const override;
-  gfx::Size GetSize() const override;
-  const DrmDevice* GetDrmDevice() const override;
-
- private:
   GbmBuffer(const scoped_refptr<GbmDevice>& gbm,
             struct gbm_bo* bo,
             uint32_t format,
@@ -60,35 +48,31 @@
             std::vector<base::ScopedFD> fds,
             const gfx::Size& size,
             std::vector<gfx::NativePixmapPlane> planes);
-  ~GbmBuffer() override;
+  ~GbmBuffer();
 
-  static scoped_refptr<GbmBuffer> CreateBufferForBO(
+  const GbmBoWrapper* gbm_bo() const { return &gbm_bo_; }
+
+ private:
+  static std::unique_ptr<GbmBuffer> CreateBufferForBO(
       const scoped_refptr<GbmDevice>& gbm,
       struct gbm_bo* bo,
       uint32_t format,
       const gfx::Size& size,
       uint32_t flags);
 
-  scoped_refptr<GbmDevice> drm_;
+  const scoped_refptr<GbmDevice> drm_;
 
   // Owned gbm_bo wrapper.
   GbmBoWrapper gbm_bo_;
 
-  uint32_t framebuffer_ = 0;
-  uint32_t framebuffer_pixel_format_ = 0;
-  // If |opaque_framebuffer_pixel_format_| differs from
-  // |framebuffer_pixel_format_| the following member is set to a valid fb,
-  // otherwise it is set to 0.
-  uint32_t opaque_framebuffer_ = 0;
-  uint32_t opaque_framebuffer_pixel_format_ = 0;
-
   DISALLOW_COPY_AND_ASSIGN(GbmBuffer);
 };
 
 class GbmPixmap : public gfx::NativePixmap {
  public:
   GbmPixmap(GbmSurfaceFactory* surface_manager,
-            const scoped_refptr<GbmBuffer>& buffer);
+            std::unique_ptr<GbmBuffer> buffer,
+            scoped_refptr<DrmFramebuffer> framebuffer);
 
   // NativePixmap:
   bool AreDmaBufFdsValid() const override;
@@ -109,15 +93,17 @@
                             std::unique_ptr<gfx::GpuFence> gpu_fence) override;
   gfx::NativePixmapHandle ExportHandle() override;
 
-  scoped_refptr<GbmBuffer> buffer() { return buffer_; }
+  GbmBuffer* buffer() { return buffer_.get(); }
+  const scoped_refptr<DrmFramebuffer>& framebuffer() const {
+    return framebuffer_;
+  }
 
  private:
   ~GbmPixmap() override;
-  scoped_refptr<DrmFramebuffer> ProcessBuffer(const gfx::Size& size,
-                                              uint32_t format);
 
   GbmSurfaceFactory* surface_manager_;
-  scoped_refptr<GbmBuffer> buffer_;
+  std::unique_ptr<GbmBuffer> buffer_;
+  scoped_refptr<DrmFramebuffer> framebuffer_;
 
   DISALLOW_COPY_AND_ASSIGN(GbmPixmap);
 };
diff --git a/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc b/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc
index bb02ad9..02e5780 100644
--- a/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc
@@ -37,9 +37,9 @@
   unsubmitted_frame.overlay_planes.reserve(overlay_planes.size());
   for (auto& plane : overlay_planes) {
     unsubmitted_frame.overlay_planes.push_back(ui::DrmOverlayPlane(
-        static_cast<GbmPixmap*>(plane.pixmap.get())->buffer(), plane.z_order,
-        plane.plane_transform, plane.display_bounds, plane.crop_rect,
-        plane.enable_blend, std::move(plane.gpu_fence)));
+        static_cast<GbmPixmap*>(plane.pixmap.get())->framebuffer(),
+        plane.z_order, plane.plane_transform, plane.display_bounds,
+        plane.crop_rect, plane.enable_blend, std::move(plane.gpu_fence)));
   }
   unsubmitted_frame.submission_callback = std::move(submission_callback);
   unsubmitted_frame.presentation_callback = std::move(presentation_callback);
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
index 5478f264..2100a39 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -164,9 +164,13 @@
     VkDeviceMemory* vk_device_memory,
     VkImage* vk_image) {
 #if defined(OS_CHROMEOS)
-  scoped_refptr<GbmBuffer> buffer = drm_thread_proxy_->CreateBuffer(
-      widget, size, format, usage, GbmBuffer::kFlagNoModifiers);
-  if (!buffer.get())
+  std::unique_ptr<GbmBuffer> buffer;
+  scoped_refptr<DrmFramebuffer> framebuffer;
+
+  drm_thread_proxy_->CreateBuffer(widget, size, format, usage,
+                                  GbmBuffer::kFlagNoModifiers, &buffer,
+                                  &framebuffer);
+  if (!buffer)
     return nullptr;
 
   PFN_vkCreateDmaBufImageINTEL create_dma_buf_image_intel =
@@ -201,7 +205,8 @@
     return nullptr;
   }
 
-  return base::MakeRefCounted<GbmPixmap>(this, buffer);
+  return base::MakeRefCounted<GbmPixmap>(this, std::move(buffer),
+                                         std::move(framebuffer));
 #else
   return nullptr;
 #endif
@@ -233,12 +238,14 @@
     gfx::Size size,
     gfx::BufferFormat format,
     gfx::BufferUsage usage) {
-  scoped_refptr<GbmBuffer> buffer = drm_thread_proxy_->CreateBuffer(
-      widget, size, format, usage, 0 /* flags */);
-  if (!buffer.get())
+  std::unique_ptr<GbmBuffer> buffer;
+  scoped_refptr<DrmFramebuffer> framebuffer;
+  drm_thread_proxy_->CreateBuffer(widget, size, format, usage, 0 /* flags */,
+                                  &buffer, &framebuffer);
+  if (!buffer)
     return nullptr;
-
-  return base::MakeRefCounted<GbmPixmap>(this, buffer);
+  return base::MakeRefCounted<GbmPixmap>(this, std::move(buffer),
+                                         std::move(framebuffer));
 }
 
 scoped_refptr<gfx::NativePixmap>
@@ -262,12 +269,15 @@
     planes.push_back(plane);
   }
 
-  scoped_refptr<GbmBuffer> buffer = drm_thread_proxy_->CreateBufferFromFds(
-      widget, size, format, std::move(scoped_fds), planes);
+  std::unique_ptr<GbmBuffer> buffer;
+  scoped_refptr<DrmFramebuffer> framebuffer;
+  drm_thread_proxy_->CreateBufferFromFds(widget, size, format,
+                                         std::move(scoped_fds), planes, &buffer,
+                                         &framebuffer);
   if (!buffer)
     return nullptr;
-
-  return base::MakeRefCounted<GbmPixmap>(this, buffer);
+  return base::MakeRefCounted<GbmPixmap>(this, std::move(buffer),
+                                         std::move(framebuffer));
 }
 
 scoped_refptr<gfx::NativePixmap>
diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
index baca67c9e..2a3d1741 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -46,8 +46,7 @@
 }
 
 void GbmSurfaceless::QueueOverlayPlane(DrmOverlayPlane plane) {
-  is_on_external_drm_device_ =
-      !plane.buffer->GetDrmDevice()->is_primary_device();
+  is_on_external_drm_device_ = !plane.buffer->drm_device()->is_primary_device();
   planes_.push_back(std::move(plane));
 }
 
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
index e9bb5e6..76d46ba 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
@@ -19,6 +19,7 @@
 #include "ui/gfx/native_pixmap.h"
 #include "ui/gfx/presentation_feedback.h"
 #include "ui/gfx/swap_result.h"
+#include "ui/ozone/platform/drm/common/drm_util.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
 #include "ui/ozone/platform/drm/gpu/drm_buffer.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
@@ -41,6 +42,16 @@
   std::move(callback).Run(presentation_feedback);
 }
 
+void DrawCursor(DrmBuffer* cursor, const SkBitmap& image) {
+  SkRect damage;
+  image.getBounds(&damage);
+
+  // Clear to transparent in case |image| is smaller than the canvas.
+  SkCanvas* canvas = cursor->GetCanvas();
+  canvas->clear(SK_ColorTRANSPARENT);
+  canvas->drawBitmapRect(image, damage, NULL);
+}
+
 }  // namespace
 
 HardwareDisplayController::HardwareDisplayController(
@@ -50,11 +61,10 @@
       is_disabled_(controller->is_disabled()),
       weak_ptr_factory_(this) {
   AddCrtc(std::move(controller));
+  AllocateCursorBuffers();
 }
 
 HardwareDisplayController::~HardwareDisplayController() {
-  // Reset the cursor.
-  UnsetCursor();
 }
 
 bool HardwareDisplayController::Modeset(const DrmOverlayPlane& primary,
@@ -66,6 +76,7 @@
     status &= controller->Modeset(primary, mode);
 
   is_disabled_ = false;
+  ResetCursor();
   OnModesetComplete(primary);
   return status;
 }
@@ -78,12 +89,14 @@
     status &= controller->Modeset(primary, controller->mode());
 
   is_disabled_ = false;
+  ResetCursor();
   OnModesetComplete(primary);
   return status;
 }
 
 void HardwareDisplayController::Disable() {
   TRACE_EVENT0("drm", "HDC::Disable");
+
   for (const auto& controller : crtc_controllers_)
     controller->Disable();
 
@@ -201,36 +214,20 @@
   return filtered_modifiers;
 }
 
-bool HardwareDisplayController::SetCursor(
-    const scoped_refptr<DrmBuffer>& buffer) {
-  bool status = true;
-
-  if (is_disabled_)
-    return true;
-
-  for (const auto& controller : crtc_controllers_)
-    status &= controller->SetCursor(buffer);
-
-  return status;
+void HardwareDisplayController::MoveCursor(const gfx::Point& location) {
+  cursor_location_ = location;
+  UpdateCursorLocation();
 }
 
-bool HardwareDisplayController::UnsetCursor() {
-  bool status = true;
-  for (const auto& controller : crtc_controllers_)
-    status &= controller->SetCursor(nullptr);
+void HardwareDisplayController::SetCursor(SkBitmap bitmap) {
+  if (bitmap.drawsNothing()) {
+    current_cursor_ = nullptr;
+  } else {
+    current_cursor_ = NextCursorBuffer();
+    DrawCursor(current_cursor_, bitmap);
+  }
 
-  return status;
-}
-
-bool HardwareDisplayController::MoveCursor(const gfx::Point& location) {
-  if (is_disabled_)
-    return true;
-
-  bool status = true;
-  for (const auto& controller : crtc_controllers_)
-    status &= controller->MoveCursor(location);
-
-  return status;
+  UpdateCursorImage();
 }
 
 void HardwareDisplayController::AddCrtc(
@@ -356,4 +353,51 @@
   time_of_last_flip_ = base::TimeTicks::Now();
 }
 
+void HardwareDisplayController::AllocateCursorBuffers() {
+  TRACE_EVENT0("drm", "HDC::AllocateCursorBuffers");
+  gfx::Size max_cursor_size = GetMaximumCursorSize(GetDrmDevice()->get_fd());
+  SkImageInfo info = SkImageInfo::MakeN32Premul(max_cursor_size.width(),
+                                                max_cursor_size.height());
+  for (size_t i = 0; i < arraysize(cursor_buffers_); ++i) {
+    cursor_buffers_[i] = std::make_unique<DrmBuffer>(GetDrmDevice());
+    // Don't register a framebuffer for cursors since they are special (they
+    // aren't modesetting buffers and drivers may fail to register them due to
+    // their small sizes).
+    if (!cursor_buffers_[i]->Initialize(
+            info, false /* should_register_framebuffer */)) {
+      LOG(FATAL) << "Failed to initialize cursor buffer";
+      return;
+    }
+  }
+}
+
+DrmBuffer* HardwareDisplayController::NextCursorBuffer() {
+  ++cursor_frontbuffer_;
+  cursor_frontbuffer_ %= base::size(cursor_buffers_);
+  return cursor_buffers_[cursor_frontbuffer_].get();
+}
+
+void HardwareDisplayController::UpdateCursorImage() {
+  uint32_t handle = 0;
+  gfx::Size size;
+
+  if (current_cursor_) {
+    handle = current_cursor_->GetHandle();
+    size = current_cursor_->GetSize();
+  }
+
+  for (const auto& controller : crtc_controllers_)
+    controller->SetCursor(handle, size);
+}
+
+void HardwareDisplayController::UpdateCursorLocation() {
+  for (const auto& controller : crtc_controllers_)
+    controller->MoveCursor(cursor_location_);
+}
+
+void HardwareDisplayController::ResetCursor() {
+  UpdateCursorLocation();
+  UpdateCursorImage();
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.h b/ui/ozone/platform/drm/gpu/hardware_display_controller.h
index 5975d5e..c232ee5 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller.h
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.h
@@ -17,6 +17,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/time/time.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/swap_result.h"
 #include "ui/ozone/platform/drm/gpu/drm_overlay_plane.h"
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h"
@@ -137,13 +138,11 @@
   std::vector<uint64_t> GetFormatModifiersForModesetting(
       uint32_t fourcc_format);
 
-  // Set the hardware cursor to show the contents of |surface|.
-  bool SetCursor(const scoped_refptr<DrmBuffer>& buffer);
-
-  bool UnsetCursor();
-
   // Moves the hardware cursor to |location|.
-  bool MoveCursor(const gfx::Point& location);
+  void MoveCursor(const gfx::Point& location);
+
+  // Set the hardware cursor to show the contents of |bitmap| at |location|.
+  void SetCursor(SkBitmap bitmap);
 
   void AddCrtc(std::unique_ptr<CrtcController> controller);
   std::unique_ptr<CrtcController> RemoveCrtc(
@@ -176,6 +175,12 @@
   bool ScheduleOrTestPageFlip(const DrmOverlayPlaneList& plane_list,
                               scoped_refptr<PageFlipRequest> page_flip_request,
                               std::unique_ptr<gfx::GpuFence>* out_fence);
+  void AllocateCursorBuffers();
+  DrmBuffer* NextCursorBuffer();
+  void UpdateCursorImage();
+  void UpdateCursorLocation();
+  void ResetCursor();
+  void DisableCursor();
 
   HardwareDisplayPlaneList owned_hardware_planes_;
 
@@ -190,6 +195,11 @@
   DrmOverlayPlaneList current_planes_;
   base::TimeTicks time_of_last_flip_;
 
+  std::unique_ptr<DrmBuffer> cursor_buffers_[2];
+  gfx::Point cursor_location_;
+  int cursor_frontbuffer_ = 0;
+  DrmBuffer* current_cursor_ = nullptr;
+
   bool is_disabled_;
 
   base::WeakPtrFactory<HardwareDisplayController> weak_ptr_factory_;
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
index b453f30..0a4c75cb 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <drm_fourcc.h>
 #include <stddef.h>
 #include <stdint.h>
 
@@ -17,7 +18,7 @@
 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h"
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane.h"
 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
-#include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h"
+#include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.h"
 
 namespace {
 
@@ -55,7 +56,18 @@
   uint64_t GetPlanePropertyValue(uint32_t plane,
                                  const std::string& property_name);
 
+  scoped_refptr<ui::DrmFramebuffer> CreateBuffer() {
+    return buffer_generator_->CreateWithModifier(
+        drm_, DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE, kDefaultModeSize);
+  }
+
+  scoped_refptr<ui::DrmFramebuffer> CreateOverlayBuffer() {
+    return buffer_generator_->CreateWithModifier(
+        drm_, DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE, kOverlaySize);
+  }
+
  protected:
+  std::unique_ptr<ui::MockDrmFramebufferGenerator> buffer_generator_;
   std::unique_ptr<ui::HardwareDisplayController> controller_;
   scoped_refptr<ui::MockDrmDevice> drm_;
 
@@ -74,6 +86,7 @@
   drm_ = new ui::MockDrmDevice;
   InitializeDrmDevice(/* use_atomic= */ true);
 
+  buffer_generator_.reset(new ui::MockDrmFramebufferGenerator());
   controller_.reset(new ui::HardwareDisplayController(
       std::unique_ptr<ui::CrtcController>(
           new ui::CrtcController(drm_.get(), kPrimaryCrtc, kPrimaryConnector)),
@@ -173,24 +186,18 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
-  ui::DrmOverlayPlane plane(scoped_refptr<ui::DrmFramebuffer>(
-                                new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                            nullptr);
+  ui::DrmOverlayPlane plane(CreateBuffer(), nullptr);
 
   EXPECT_TRUE(controller_->Modeset(plane, kDefaultMode));
   EXPECT_FALSE(plane.buffer->HasOneRef());
 }
 
 TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
-  ui::DrmOverlayPlane plane2(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane2.Clone());
 
@@ -211,9 +218,7 @@
 TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) {
   drm_->set_set_crtc_expectation(false);
 
-  ui::DrmOverlayPlane plane(scoped_refptr<ui::DrmFramebuffer>(
-                                new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                            nullptr);
+  ui::DrmOverlayPlane plane(CreateBuffer(), nullptr);
 
   EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode));
 }
@@ -221,15 +226,11 @@
 TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) {
   drm_->set_commit_expectation(false);
 
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
-  ui::DrmOverlayPlane plane2(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane2.Clone());
   EXPECT_DEATH_IF_SUPPORTED(SchedulePageFlip(std::move(planes)),
@@ -237,14 +238,10 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
-  ui::DrmOverlayPlane plane2(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kOverlaySize)),
-                             1, gfx::OVERLAY_TRANSFORM_NONE,
-                             gfx::Rect(kOverlaySize),
-                             gfx::RectF(kDefaultModeSizeF), true, nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
+  ui::DrmOverlayPlane plane2(
+      CreateOverlayBuffer(), 1, gfx::OVERLAY_TRANSFORM_NONE,
+      gfx::Rect(kOverlaySize), gfx::RectF(kDefaultModeSizeF), true, nullptr);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
@@ -263,14 +260,10 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, CheckOverlayTestMode) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
-  ui::DrmOverlayPlane plane2(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kOverlaySize)),
-                             1, gfx::OVERLAY_TRANSFORM_NONE,
-                             gfx::Rect(kOverlaySize),
-                             gfx::RectF(kDefaultModeSizeF), true, nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
+  ui::DrmOverlayPlane plane2(
+      CreateOverlayBuffer(), 1, gfx::OVERLAY_TRANSFORM_NONE,
+      gfx::Rect(kOverlaySize), gfx::RectF(kDefaultModeSizeF), true, nullptr);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
@@ -303,12 +296,8 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, AcceptUnderlays) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
-  ui::DrmOverlayPlane plane2(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             -1, gfx::OVERLAY_TRANSFORM_NONE,
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
+  ui::DrmOverlayPlane plane2(CreateBuffer(), -1, gfx::OVERLAY_TRANSFORM_NONE,
                              gfx::Rect(kDefaultModeSize),
                              gfx::RectF(kDefaultModeSizeF), true, nullptr);
 
@@ -328,15 +317,11 @@
   controller_->AddCrtc(std::unique_ptr<ui::CrtcController>(
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
 
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   EXPECT_EQ(2, drm_->get_set_crtc_call_count());
 
-  ui::DrmOverlayPlane plane2(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane2.Clone());
   SchedulePageFlip(std::move(planes));
@@ -357,9 +342,7 @@
   controller_->AddCrtc(std::unique_ptr<ui::CrtcController>(
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
 
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -403,9 +386,7 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterDestroyingCrtc) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -433,9 +414,7 @@
   controller_->AddCrtc(std::unique_ptr<ui::CrtcController>(
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
 
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -481,9 +460,7 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -498,9 +475,7 @@
 TEST_F(HardwareDisplayControllerTest, FailPageFlipping) {
   drm_->set_commit_expectation(false);
 
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -509,9 +484,7 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, CheckNoPrimaryPlane) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             1, gfx::OVERLAY_TRANSFORM_NONE,
+  ui::DrmOverlayPlane plane1(CreateBuffer(), 1, gfx::OVERLAY_TRANSFORM_NONE,
                              gfx::Rect(kDefaultModeSize),
                              gfx::RectF(0, 0, 1, 1), true, nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
@@ -525,9 +498,7 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -542,9 +513,7 @@
 }
 
 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) {
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
@@ -561,13 +530,11 @@
   // Page flipping overlays is only supported on atomic configurations.
   InitializeDrmDevice(/* use_atomic= */ true);
 
-  ui::DrmOverlayPlane plane1(scoped_refptr<ui::DrmFramebuffer>(
-                                 new ui::MockDrmFramebuffer(kDefaultModeSize)),
-                             nullptr);
+  ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
   ui::DrmOverlayPlane plane2(
-      new ui::MockDrmFramebuffer(kOverlaySize), 1, gfx::OVERLAY_TRANSFORM_NONE,
+      CreateOverlayBuffer(), 1, gfx::OVERLAY_TRANSFORM_NONE,
       gfx::Rect(kOverlaySize), gfx::RectF(kDefaultModeSizeF), true, nullptr);
   std::vector<ui::DrmOverlayPlane> planes;
   planes.push_back(plane1.Clone());
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc
index e8d2e27..7b711d13 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc
@@ -114,9 +114,9 @@
       !plane->CanUseForCrtc(crtc_index))
     return false;
 
-  const uint32_t format = overlay.enable_blend ?
-      overlay.buffer->GetFramebufferPixelFormat() :
-      overlay.buffer->GetOpaqueFramebufferPixelFormat();
+  const uint32_t format =
+      overlay.enable_blend ? overlay.buffer->framebuffer_pixel_format()
+                           : overlay.buffer->opaque_framebuffer_pixel_format();
   if (!plane->IsSupportedFormat(format))
     return false;
 
@@ -181,7 +181,7 @@
 
     gfx::Rect fixed_point_rect;
     if (hw_plane->type() != HardwareDisplayPlane::kDummy) {
-      const gfx::Size& size = plane.buffer->GetSize();
+      const gfx::Size& size = plane.buffer->size();
       gfx::RectF crop_rect = plane.crop_rect;
       crop_rect.Scale(size.width(), size.height());
 
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
index e780209..c5d9339 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
@@ -222,8 +222,8 @@
   HardwareDisplayPlaneAtomic* atomic_plane =
       static_cast<HardwareDisplayPlaneAtomic*>(hw_plane);
   uint32_t framebuffer_id = overlay.enable_blend
-                                ? overlay.buffer->GetFramebufferId()
-                                : overlay.buffer->GetOpaqueFramebufferId();
+                                ? overlay.buffer->framebuffer_id()
+                                : overlay.buffer->opaque_framebuffer_id();
   int fence_fd = base::kInvalidPlatformFile;
 
   if (overlay.gpu_fence) {
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
index 06f5bb1..608134e 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
@@ -112,7 +112,7 @@
     const drmModeModeInfo& mode) {
   DCHECK(primary.buffer.get());
 
-  return primary.buffer->GetSize() == gfx::Size(mode.hdisplay, mode.vdisplay);
+  return primary.buffer->size() == gfx::Size(mode.hdisplay, mode.vdisplay);
 }
 
 void HardwareDisplayPlaneManagerLegacy::RequestPlanesReadyCallback(
@@ -184,7 +184,7 @@
       plane_list->legacy_page_flips.back().crtc_id != crtc_id) {
     plane_list->legacy_page_flips.push_back(
         HardwareDisplayPlaneList::PageFlipInfo(
-            crtc_id, overlay.buffer->GetOpaqueFramebufferId(), crtc));
+            crtc_id, overlay.buffer->opaque_framebuffer_id(), crtc));
   } else {
     return false;
   }
@@ -202,7 +202,7 @@
 
   // When using legacy kms we always scanout only one plane (the primary),
   // and we always use the opaque fb. Refer to SetPlaneData above.
-  const uint32_t format = overlay.buffer->GetOpaqueFramebufferPixelFormat();
+  const uint32_t format = overlay.buffer->opaque_framebuffer_pixel_format();
   return plane->IsSupportedFormat(format);
 }
 
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
index 6326f9cb..7944c60 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <drm_fourcc.h>
 #include <stdint.h>
 #include <unistd.h>
 
@@ -22,7 +23,7 @@
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h"
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h"
 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
-#include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h"
+#include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.h"
 
 namespace {
 
@@ -38,7 +39,6 @@
 constexpr uint32_t kOutFencePtrPropId = 308;
 constexpr uint32_t kInFormatsBlobPropId = 400;
 
-const uint32_t kDummyFormat = 0;
 const gfx::Size kDefaultBufferSize(2, 2);
 
 class HardwareDisplayPlaneManagerTest
@@ -61,9 +61,22 @@
 
   void SetUp() override;
 
+  scoped_refptr<ui::DrmFramebuffer> CreateBuffer(const gfx::Size& size) {
+    return buffer_generator_->CreateWithModifier(fake_drm_, DRM_FORMAT_XRGB8888,
+                                                 DRM_FORMAT_MOD_NONE, size);
+  }
+
+  scoped_refptr<ui::DrmFramebuffer> CreateBufferWithFormat(
+      const gfx::Size& size,
+      uint32_t format) {
+    return buffer_generator_->CreateWithModifier(fake_drm_, format,
+                                                 DRM_FORMAT_MOD_NONE, size);
+  }
+
  protected:
   ui::HardwareDisplayPlaneList state_;
   scoped_refptr<ui::DrmFramebuffer> fake_buffer_;
+  std::unique_ptr<ui::MockDrmFramebufferGenerator> buffer_generator_;
   scoped_refptr<ui::MockDrmDevice> fake_drm_;
 
   std::vector<ui::MockDrmDevice::CrtcProperties> crtc_properties_;
@@ -78,11 +91,13 @@
 
 void HardwareDisplayPlaneManagerTest::SetUp() {
   use_atomic_ = GetParam();
-  fake_buffer_ = new ui::MockDrmFramebuffer(kDefaultBufferSize);
+  buffer_generator_.reset(new ui::MockDrmFramebufferGenerator());
 
   fake_drm_ = new ui::MockDrmDevice;
   fake_drm_->SetPropertyBlob(ui::MockDrmDevice::AllocateInFormatsBlob(
       kInFormatsBlobPropId, {DRM_FORMAT_XRGB8888}, {}));
+
+  fake_buffer_ = CreateBuffer(kDefaultBufferSize);
 }
 
 void HardwareDisplayPlaneManagerTest::InitializeDrmState(
@@ -154,8 +169,8 @@
     ui::HardwareDisplayPlaneList* state) {
   ui::DrmOverlayPlaneList assigns;
   ui::CrtcController crtc(fake_drm_, crtc_properties_[crtc_idx].id, 0);
-  scoped_refptr<ui::MockDrmFramebuffer> xrgb_buffer =
-      new ui::MockDrmFramebuffer(kDefaultBufferSize);
+  scoped_refptr<ui::DrmFramebuffer> xrgb_buffer =
+      CreateBuffer(kDefaultBufferSize);
   assigns.push_back(ui::DrmOverlayPlane(xrgb_buffer, nullptr));
   fake_drm_->plane_manager()->BeginFrame(state);
   ASSERT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
@@ -282,8 +297,8 @@
 
 TEST_P(HardwareDisplayPlaneManagerLegacyTest, CheckFramebufferFormatMatch) {
   ui::DrmOverlayPlaneList assigns;
-  scoped_refptr<ui::MockDrmFramebuffer> buffer =
-      new ui::MockDrmFramebuffer(kDefaultBufferSize, kDummyFormat);
+  scoped_refptr<ui::DrmFramebuffer> buffer =
+      CreateBufferWithFormat(kDefaultBufferSize, DRM_FORMAT_NV12);
   assigns.push_back(ui::DrmOverlayPlane(buffer, nullptr));
 
   InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
@@ -296,8 +311,8 @@
   EXPECT_FALSE(fake_drm_->plane_manager()->AssignOverlayPlanes(
       &state_, assigns, crtc_properties_[0].id, nullptr));
   assigns.clear();
-  scoped_refptr<ui::MockDrmFramebuffer> xrgb_buffer =
-      new ui::MockDrmFramebuffer(kDefaultBufferSize);
+  scoped_refptr<ui::DrmFramebuffer> xrgb_buffer =
+      CreateBuffer(kDefaultBufferSize);
   assigns.push_back(ui::DrmOverlayPlane(xrgb_buffer, nullptr));
   fake_drm_->plane_manager()->BeginFrame(&state_);
   EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
@@ -339,8 +354,7 @@
 
 TEST_P(HardwareDisplayPlaneManagerAtomicTest, SharedPlanes) {
   ui::DrmOverlayPlaneList assigns;
-  scoped_refptr<ui::MockDrmFramebuffer> buffer =
-      new ui::MockDrmFramebuffer(gfx::Size(1, 1));
+  scoped_refptr<ui::DrmFramebuffer> buffer = CreateBuffer(gfx::Size(1, 1));
 
   assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
   assigns.push_back(ui::DrmOverlayPlane(buffer, nullptr));
@@ -371,10 +385,10 @@
                              property_names_, use_atomic_);
 
   ui::DrmOverlayPlaneList assigns;
-  scoped_refptr<ui::MockDrmFramebuffer> primary_buffer =
-      new ui::MockDrmFramebuffer(kDefaultBufferSize);
-  scoped_refptr<ui::MockDrmFramebuffer> overlay_buffer =
-      new ui::MockDrmFramebuffer(gfx::Size(1, 1));
+  scoped_refptr<ui::DrmFramebuffer> primary_buffer =
+      CreateBuffer(kDefaultBufferSize);
+  scoped_refptr<ui::DrmFramebuffer> overlay_buffer =
+      CreateBuffer(gfx::Size(1, 1));
   assigns.push_back(ui::DrmOverlayPlane(primary_buffer, nullptr));
   assigns.push_back(ui::DrmOverlayPlane(overlay_buffer, nullptr));
   ui::HardwareDisplayPlaneList hdpl;
@@ -664,7 +678,7 @@
 TEST_P(HardwareDisplayPlaneManagerAtomicTest,
        CommitReturnsNullOutFenceIfOutFencePtrNotSupported) {
   scoped_refptr<ui::DrmFramebuffer> fake_buffer2 =
-      new ui::MockDrmFramebuffer(kDefaultBufferSize);
+      CreateBuffer(kDefaultBufferSize);
 
   InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
   fake_drm_->InitializeState(crtc_properties_, plane_properties_,
@@ -765,42 +779,56 @@
 
 class HardwareDisplayPlaneManagerPlanesReadyTest : public testing::Test {
  protected:
-  HardwareDisplayPlaneManagerPlanesReadyTest()
-      : planes_without_fences_(CreatePlanesWithoutFences()),
-        planes_with_fences_(CreatePlanesWithoutFences()) {}
+  HardwareDisplayPlaneManagerPlanesReadyTest() {}
+
+  void SetUp() override {
+    fake_drm_ = new ui::MockDrmDevice;
+    buffer_generator_.reset(new ui::MockDrmFramebufferGenerator());
+    drm_framebuffer_ = CreateBuffer(kDefaultBufferSize);
+    planes_without_fences_ = CreatePlanesWithoutFences();
+    planes_with_fences_ = CreatePlanesWithFences();
+  }
 
   void UseLegacyManager();
   void UseAtomicManager();
   void RequestPlanesReady(ui::DrmOverlayPlaneList planes);
 
+  scoped_refptr<ui::DrmFramebuffer> CreateBuffer(const gfx::Size& size) {
+    return buffer_generator_->CreateWithModifier(fake_drm_, DRM_FORMAT_XRGB8888,
+                                                 DRM_FORMAT_MOD_NONE, size);
+  }
+
   ui::DrmOverlayPlaneList CreatePlanesWithoutFences() {
     ui::DrmOverlayPlaneList planes;
-    planes.push_back(ui::DrmOverlayPlane(drm_framebuffer, nullptr));
-    planes.push_back(ui::DrmOverlayPlane(drm_framebuffer, nullptr));
+    planes.push_back(
+        ui::DrmOverlayPlane(CreateBuffer(kDefaultBufferSize), nullptr));
+    planes.push_back(
+        ui::DrmOverlayPlane(CreateBuffer(kDefaultBufferSize), nullptr));
     return planes;
   }
 
   ui::DrmOverlayPlaneList CreatePlanesWithFences() {
     ui::DrmOverlayPlaneList planes;
-    planes.push_back(
-        ui::DrmOverlayPlane(drm_framebuffer, fake_fence_fd1.GetGpuFence()));
-    planes.push_back(
-        ui::DrmOverlayPlane(drm_framebuffer, fake_fence_fd2.GetGpuFence()));
+    planes.push_back(ui::DrmOverlayPlane(CreateBuffer(kDefaultBufferSize),
+                                         fake_fence_fd1_.GetGpuFence()));
+    planes.push_back(ui::DrmOverlayPlane(CreateBuffer(kDefaultBufferSize),
+                                         fake_fence_fd2_.GetGpuFence()));
     return planes;
   }
 
+  scoped_refptr<ui::MockDrmDevice> fake_drm_;
+  std::unique_ptr<ui::MockDrmFramebufferGenerator> buffer_generator_;
   std::unique_ptr<ui::HardwareDisplayPlaneManager> plane_manager_;
   bool callback_called = false;
   base::test::ScopedTaskEnvironment task_env_{
       base::test::ScopedTaskEnvironment::MainThreadType::DEFAULT,
       base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED};
-  const scoped_refptr<ui::DrmFramebuffer> drm_framebuffer{
-      new ui::MockDrmFramebuffer(kDefaultBufferSize)};
-  const FakeFenceFD fake_fence_fd1;
-  const FakeFenceFD fake_fence_fd2;
+  scoped_refptr<ui::DrmFramebuffer> drm_framebuffer_;
+  const FakeFenceFD fake_fence_fd1_;
+  const FakeFenceFD fake_fence_fd2_;
 
-  const ui::DrmOverlayPlaneList planes_without_fences_;
-  const ui::DrmOverlayPlaneList planes_with_fences_;
+  ui::DrmOverlayPlaneList planes_without_fences_;
+  ui::DrmOverlayPlaneList planes_with_fences_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManagerPlanesReadyTest);
@@ -840,8 +868,8 @@
 
   EXPECT_FALSE(callback_called);
 
-  fake_fence_fd1.Signal();
-  fake_fence_fd2.Signal();
+  fake_fence_fd1_.Signal();
+  fake_fence_fd2_.Signal();
 
   EXPECT_FALSE(callback_called);
 
@@ -898,20 +926,24 @@
 TEST(HardwareDisplayPlaneManagerAtomic, EnableBlend) {
   auto plane_manager =
       std::make_unique<ui::HardwareDisplayPlaneManagerAtomic>();
+  auto drm_device = base::MakeRefCounted<ui::MockDrmDevice>();
+  auto buffer_generator = std::make_unique<ui::MockDrmFramebufferGenerator>();
   ui::HardwareDisplayPlaneList plane_list;
   HardwareDisplayPlaneAtomicMock hw_plane;
   scoped_refptr<ui::DrmFramebuffer> buffer =
-      new ui::MockDrmFramebuffer(kDefaultBufferSize);
+      buffer_generator->CreateWithModifier(
+          drm_device.get(), DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE,
+          kDefaultBufferSize);
   ui::DrmOverlayPlane overlay(buffer, nullptr);
   overlay.enable_blend = true;
   plane_manager->SetPlaneData(&plane_list, &hw_plane, overlay, 1, gfx::Rect(),
                               nullptr);
-  EXPECT_EQ(hw_plane.framebuffer(), buffer->GetFramebufferId());
+  EXPECT_EQ(hw_plane.framebuffer(), buffer->framebuffer_id());
 
   overlay.enable_blend = false;
   plane_manager->SetPlaneData(&plane_list, &hw_plane, overlay, 1, gfx::Rect(),
                               nullptr);
-  EXPECT_EQ(hw_plane.framebuffer(), buffer->GetOpaqueFramebufferId());
+  EXPECT_EQ(hw_plane.framebuffer(), buffer->opaque_framebuffer_id());
 }
 
 }  // namespace
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_framebuffer.cc b/ui/ozone/platform/drm/gpu/mock_drm_framebuffer.cc
deleted file mode 100644
index 41927bb..0000000
--- a/ui/ozone/platform/drm/gpu/mock_drm_framebuffer.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 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/ozone/platform/drm/gpu/mock_drm_framebuffer.h"
-#include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
-
-namespace ui {
-
-namespace {
-
-uint32_t g_current_framebuffer_id = 1;
-
-}  // namespace
-
-MockDrmFramebuffer::MockDrmFramebuffer(const gfx::Size& size,
-                                       uint32_t format,
-                                       uint64_t modifier,
-                                       const scoped_refptr<DrmDevice>& drm)
-    : size_(size),
-      format_(format),
-      modifier_(modifier),
-      id_(g_current_framebuffer_id++),
-      opaque_id_(g_current_framebuffer_id++),
-      drm_(drm) {}
-
-MockDrmFramebuffer::~MockDrmFramebuffer() {}
-
-uint32_t MockDrmFramebuffer::GetFramebufferId() const {
-  return id_;
-}
-
-uint32_t MockDrmFramebuffer::GetOpaqueFramebufferId() const {
-  return opaque_id_;
-}
-
-gfx::Size MockDrmFramebuffer::GetSize() const {
-  return size_;
-}
-
-uint32_t MockDrmFramebuffer::GetFramebufferPixelFormat() const {
-  return format_;
-}
-
-uint32_t MockDrmFramebuffer::GetOpaqueFramebufferPixelFormat() const {
-  return format_;
-}
-
-uint64_t MockDrmFramebuffer::GetFormatModifier() const {
-  return modifier_;
-}
-
-const DrmDevice* MockDrmFramebuffer::GetDrmDevice() const {
-  return drm_.get();
-}
-
-}  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h b/ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h
deleted file mode 100644
index b6132ea3..0000000
--- a/ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2015 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_OZONE_PLATFORM_DRM_GPU_MOCK_SCANOUT_BUFFER_H_
-#define UI_OZONE_PLATFORM_DRM_GPU_MOCK_SCANOUT_BUFFER_H_
-
-#include <drm_fourcc.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "ui/ozone/platform/drm/gpu/drm_framebuffer.h"
-
-namespace ui {
-
-class DrmDevice;
-
-class MockDrmFramebuffer : public DrmFramebuffer {
- public:
-  MockDrmFramebuffer(const gfx::Size& size,
-                     uint32_t format = DRM_FORMAT_XRGB8888,
-                     uint64_t modifier = DRM_FORMAT_MOD_NONE,
-                     const scoped_refptr<DrmDevice>& drm = nullptr);
-
-  // DrmFramebuffer:
-  uint32_t GetFramebufferId() const override;
-  uint32_t GetOpaqueFramebufferId() const override;
-  gfx::Size GetSize() const override;
-  uint32_t GetFramebufferPixelFormat() const override;
-  uint32_t GetOpaqueFramebufferPixelFormat() const override;
-  uint64_t GetFormatModifier() const override;
-  const DrmDevice* GetDrmDevice() const override;
-
- private:
-  ~MockDrmFramebuffer() override;
-
-  gfx::Size size_;
-  uint32_t format_;
-  uint64_t modifier_;
-  uint32_t id_;
-  uint32_t opaque_id_;
-  scoped_refptr<DrmDevice> drm_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockDrmFramebuffer);
-};
-
-}  // namespace ui
-
-#endif  // UI_OZONE_PLATFORM_DRM_GPU_MOCK_SCANOUT_BUFFER_H_
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.cc b/ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.cc
index b9b17f4..41fb7ba 100644
--- a/ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.cc
+++ b/ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.cc
@@ -4,11 +4,19 @@
 
 #include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer_generator.h"
 
+#include <drm_fourcc.h>
+
 #include "ui/ozone/platform/drm/common/drm_util.h"
-#include "ui/ozone/platform/drm/gpu/mock_drm_framebuffer.h"
+#include "ui/ozone/platform/drm/gpu/drm_device.h"
 
 namespace ui {
 
+namespace {
+
+uint32_t g_current_mock_buffer_handle = 0x1111;
+
+}  // namespace
+
 MockDrmFramebufferGenerator::MockDrmFramebufferGenerator() {}
 
 MockDrmFramebufferGenerator::~MockDrmFramebufferGenerator() {}
@@ -31,10 +39,15 @@
   if (allocation_failure_)
     return nullptr;
 
-  scoped_refptr<MockDrmFramebuffer> buffer(
-      new MockDrmFramebuffer(size, format, modifier, drm));
+  DrmFramebuffer::AddFramebufferParams params;
+  params.format = format;
+  params.modifier = modifier;
+  params.width = size.width();
+  params.height = size.height();
+  params.num_planes = 1;
+  params.handles[0] = g_current_mock_buffer_handle++;
 
-  return buffer;
+  return DrmFramebuffer::AddFramebuffer(drm, params);
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc b/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc
index 352aff2..2200a824 100644
--- a/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc
+++ b/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc
@@ -18,12 +18,12 @@
     uint32_t format,
     const std::vector<uint64_t>& modifiers,
     const gfx::Size& size) {
-  scoped_refptr<DrmBuffer> buffer(new DrmBuffer(drm));
+  std::unique_ptr<DrmBuffer> buffer(new DrmBuffer(drm));
   SkImageInfo info = SkImageInfo::MakeN32Premul(size.width(), size.height());
   if (!buffer->Initialize(info, true /* should_register_framebuffer */))
     return NULL;
 
-  return buffer;
+  return buffer->framebuffer();
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc
index e1b0112..3cd0ad0 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -33,9 +33,9 @@
 void FillModesetBuffer(const scoped_refptr<DrmDevice>& drm,
                        HardwareDisplayController* controller,
                        DrmFramebuffer* buffer) {
-  DrmConsoleBuffer modeset_buffer(drm, buffer->GetOpaqueFramebufferId());
+  DrmConsoleBuffer modeset_buffer(drm, buffer->opaque_framebuffer_id());
   if (!modeset_buffer.Initialize()) {
-    VLOG(2) << "Failed to grab framebuffer " << buffer->GetOpaqueFramebufferId();
+    VLOG(2) << "Failed to grab framebuffer " << buffer->opaque_framebuffer_id();
     return;
   }
 
@@ -47,7 +47,7 @@
     return;
   }
 
-  uint32_t fourcc_format = buffer->GetFramebufferPixelFormat();
+  uint32_t fourcc_format = buffer->framebuffer_pixel_format();
   const auto& modifiers = controller->GetFormatModifiers(fourcc_format);
   for (const uint64_t modifier : modifiers) {
     // A value of 0 means DRM_FORMAT_MOD_NONE. If the CRTC has any other
@@ -371,8 +371,8 @@
   if (window) {
     const DrmOverlayPlane* primary = window->GetLastModesetBuffer();
     const DrmDevice* drm = controller->GetDrmDevice().get();
-    if (primary && primary->buffer->GetSize() == bounds.size() &&
-        primary->buffer->GetDrmDevice() == drm) {
+    if (primary && primary->buffer->size() == bounds.size() &&
+        primary->buffer->drm_device() == drm) {
       // If the controller doesn't advertise modifiers, wont have a
       // modifier either and we can reuse the buffer. Otherwise, check
       // to see if the controller supports the buffers format
@@ -380,7 +380,7 @@
       if (modifiers.empty())
         return primary->Clone();
       for (const uint64_t modifier : modifiers) {
-        if (modifier == primary->buffer->GetFormatModifier())
+        if (modifier == primary->buffer->format_modifier())
           return primary->Clone();
       }
     }
diff --git a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
index 7a2751c..d88806e 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
@@ -518,7 +518,7 @@
       drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(),
       kDefaultMode);
 
-  EXPECT_EQ(buffer->GetOpaqueFramebufferId(), drm_->current_framebuffer());
+  EXPECT_EQ(buffer->opaque_framebuffer_id(), drm_->current_framebuffer());
 
   window = screen_manager_->RemoveWindow(1);
   window->Shutdown();
@@ -550,8 +550,8 @@
   // modeset the new controller) should reject the buffer with
   // I915_FORMAT_MOD_X_TILED modifier we created above and the two
   // framebuffer IDs should be different.
-  EXPECT_NE(buffer->GetFramebufferId(), drm_->current_framebuffer());
-  EXPECT_NE(buffer->GetOpaqueFramebufferId(), drm_->current_framebuffer());
+  EXPECT_NE(buffer->framebuffer_id(), drm_->current_framebuffer());
+  EXPECT_NE(buffer->opaque_framebuffer_id(), drm_->current_framebuffer());
 
   window = screen_manager_->RemoveWindow(1);
   window->Shutdown();