diff --git a/DEPS b/DEPS
index 5c79a201..902630cd 100644
--- a/DEPS
+++ b/DEPS
@@ -181,11 +181,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': '4a6e84920793bd6f98c4a15f2eda90b7e4074a7b',
+  'skia_revision': '1d457b7d9533d229dc1d22d0768878f0e468bf36',
   # 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': '1f5e1e29dd98ab0f0ff1f64183ce5ace076aeb5f',
+  'v8_revision': '1c30f07c92a6ad9849ce0da9d8e8602827314ab4',
   # 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.
@@ -193,15 +193,15 @@
   # 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': '99c274baf503ac6d7ece36c848bfcc1f1488e3f5',
+  'angle_revision': 'c431d59626e1e878022703f79585fddae8c0cfe7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '8a7067d8817495fc0af2da6d71d94f16693b9f3e',
+  'swiftshader_revision': '77c89ff847b623b76f8b559562dc4b8f767a621f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'e83d8b4f0dd4b0c4edc3ea0d24d5fc0fcce40ed4',
+  'pdfium_revision': 'f793e3abc4ecaea52b9f1e960df3505233e466d6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -244,7 +244,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': 'a47e1e9794a79e808878498b1146dca30c4902ae',
+  'catapult_revision': '52175631d301a98a7c0580343d5e6771fe0f5fb0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -252,7 +252,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '53a21700cf151578c6ff553b2df681b1c8f06ef7',
+  'devtools_frontend_revision': 'b629ec3917dad4e715ef4db128f7838e3e0fb3ed',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -312,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '9b2712456fe635ae460bd3bc4fbf29b78772e2e0',
+  'dawn_revision': 'c3609d224afd8509f03ef35c792448b750a9d20c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -904,7 +904,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0d462e99bc1f4e053b682249d3b4e2e972d11c6f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '081c5b5979689733fe4bd1a7618943a061cc353f',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -929,7 +929,7 @@
   },
 
   'src/third_party/ffmpeg':
-    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '252792a1ff65deadc4e627e59ce80b8811c5a5de',
+    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'bcc5d9fec0a32ec5a90b831e5d0414639af34e1f',
 
   'src/third_party/flac':
     Var('chromium_git') + '/chromium/deps/flac.git' + '@' + 'af862024c8c8fa0ae07ced05e89013d881b00596',
@@ -1297,7 +1297,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7f86589d1522ce8bfc59f6b569ca52496a53eb79',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '9553930c2093fd36cd79e2756294cec2e55bd624',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1394,7 +1394,7 @@
   },
 
   'src/third_party/re2/src':
-    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'f71aaa0be84a7b401bc6494488880f3b17b5bca9',
+    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '5fcdf4ad49097668f0f260dbe6b21fa133302f78',
 
   'src/third_party/r8': {
       'packages': [
@@ -1498,7 +1498,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '88d715c9115a5ce65c0bf660209dfeee9131ccd0',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '340a62eb5a43fa476e1e7f1d76a49eb8f4e19fd5',
+    Var('webrtc_git') + '/src.git' + '@' + '293d46c31c84ba4e8841b0ec3ed0156ec499e353',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1568,7 +1568,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fbc5981eaf58fdf3d305f316542ae956dc33a2f4',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@72cd27a2044107c376e5f85a2cbd22c986d6cb5e',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/network_service/aw_proxy_config_monitor.cc b/android_webview/browser/network_service/aw_proxy_config_monitor.cc
index 7d9c4e2..59774c0 100644
--- a/android_webview/browser/network_service/aw_proxy_config_monitor.cc
+++ b/android_webview/browser/network_service/aw_proxy_config_monitor.cc
@@ -12,6 +12,7 @@
 #include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/no_destructor.h"
+#include "base/trace_event/trace_event.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 
 namespace android_webview {
@@ -22,6 +23,7 @@
 }  // namespace
 
 AwProxyConfigMonitor::AwProxyConfigMonitor() {
+  TRACE_EVENT0("startup", "AwProxyConfigMonitor");
   proxy_config_service_android_ =
       std::make_unique<net::ProxyConfigServiceAndroid>(
           base::ThreadTaskRunnerHandle::Get(),
diff --git a/ash/components/strings/ash_components_strings_es-419.xtb b/ash/components/strings/ash_components_strings_es-419.xtb
index be7fca6a..f7d59c6 100644
--- a/ash/components/strings/ash_components_strings_es-419.xtb
+++ b/ash/components/strings/ash_components_strings_es-419.xtb
@@ -30,7 +30,7 @@
 <translation id="2040706009561734834">Abrir y cerrar el Selector</translation>
 <translation id="2088054208777350526">Buscar combinaciones de teclas</translation>
 <translation id="2125211348069077981"><ph name="ALT" /><ph name="SEPARATOR" /><ph name="E" /> o <ph name="F" /></translation>
-<translation id="2145908266289632567">Edición de textos</translation>
+<translation id="2145908266289632567">Edición de texto</translation>
 <translation id="215292019801409139"><ph name="SEARCH" /><ph name="SEPARATOR" /> 1 a =</translation>
 <translation id="2181097965834437145">Mostrar u ocultar la barra de favoritos</translation>
 <translation id="2185166372312820725">Ir a la pestaña anterior</translation>
@@ -99,7 +99,7 @@
 <translation id="4240486403425279990">Modo de descripción general</translation>
 <translation id="4382340674111381977">Volver a la página anterior</translation>
 <translation id="4458670250301149821">Mueve el ícono de una app hacia dentro o fuera de una carpeta en la grilla de apps</translation>
-<translation id="4472417192667361414">Configuración del sistema y la pantalla</translation>
+<translation id="4472417192667361414">Ajustes de sistema y pantalla</translation>
 <translation id="449214506787633354"><ph name="CTRL" />, luego, <ph name="LEFT" /> o <ph name="RIGHT" /> o <ph name="UP" /> o <ph name="DOWN" /></translation>
 <translation id="4556221320735744018">Mostrar el asistente de combinaciones de teclas</translation>
 <translation id="4628718545549558538">Abrir el área de estado (donde aparece la imagen de tu cuenta)</translation>
@@ -132,11 +132,11 @@
 <translation id="6022924867608035986">Borrar el texto en el cuadro de búsqueda</translation>
 <translation id="6045998054441862242">Activar el modo de contraste alto</translation>
 <translation id="6052614013050385269">Hacer clic con el botón derecho en un vínculo</translation>
-<translation id="6129953537138746214">Google Space</translation>
+<translation id="6129953537138746214">Espacio</translation>
 <translation id="6143669479988153888">Acercar la página</translation>
 <translation id="6185696379715117369">Retroceder página</translation>
 <translation id="6228457605945141550">Disminuir el brillo</translation>
-<translation id="6276708887952587684">Ver la página de origen</translation>
+<translation id="6276708887952587684">Ver el código fuente de la página</translation>
 <translation id="6321940490215594447">Abrir la página Historial</translation>
 <translation id="6340769215862220182">Acercar la pantalla</translation>
 <translation id="6359811074279051077"><ph name="MODIFIER" /><ph name="SEPARATOR" /><ph name="KEY" /></translation>
@@ -211,7 +211,7 @@
 <translation id="9091855755813503076">Ir al comienzo de la línea</translation>
 <translation id="9106898733795143799">Página y navegador web</translation>
 <translation id="9162942292291287644">No se encontraron resultados de búsqueda para <ph name="QUERY" /></translation>
-<translation id="9179672198516322668">Combinaciones de teclas populares</translation>
+<translation id="9179672198516322668">Combinaciones populares</translation>
 <translation id="93603345341560814">Presiona <ph name="SHIFT" /> y haz clic en un vínculo</translation>
 <translation id="945383118875625837">Arrastrar el vínculo a la barra de favoritos</translation>
 <translation id="969054500339500113">Mover el foco a la barra de menú</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index 864e51d..aa29b8c 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -142,7 +142,7 @@
 <translation id="2825619548187458965">Biblioteca</translation>
 <translation id="2844169650293029770">Dispositivo USB-C (puerto lateral izquierdo delantero)</translation>
 <translation id="2865888419503095837">Información de red</translation>
-<translation id="2872961005593481000">Cerrar</translation>
+<translation id="2872961005593481000">Apagar</translation>
 <translation id="2878884018241093801">No hay elementos recientes</translation>
 <translation id="2903844815300039659">Conectado a <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2942350706960889382">Lupa con vista acoplada</translation>
@@ -305,7 +305,7 @@
 <translation id="5083553833479578423">Desbloquea más funciones del Asistente.</translation>
 <translation id="5136175204352732067">Se conectó otro teclado</translation>
 <translation id="5168181903108465623">Dispositivos de transmisión disponibles</translation>
-<translation id="5207949376430453814">Destacar el cursor de texto</translation>
+<translation id="5207949376430453814">Destacar el símbolo de intercalación de texto</translation>
 <translation id="5222676887888702881">Salir</translation>
 <translation id="523505283826916779">Configuración de accesibilidad</translation>
 <translation id="5260676007519551770">Escritorio 4</translation>
@@ -341,7 +341,7 @@
 <translation id="574392208103952083">Media</translation>
 <translation id="5744083938413354016">Función tocar y arrastrar</translation>
 <translation id="5745612484876805746">Se activa la Luz nocturna automáticamente al atardecer</translation>
-<translation id="5750765938512549687">Se activó la conexión Bluetooth</translation>
+<translation id="5750765938512549687">Se desactivó la conexión Bluetooth</translation>
 <translation id="576453121877257266">La luz nocturna está activada.</translation>
 <translation id="5777841717266010279">¿Dejar de compartir la pantalla?</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index b056ce9f..1144837d 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -439,10 +439,16 @@
   if (bubble_)
     bubble_->UpdateTransform();
   if (expanded_amount == 0.0 || expanded_amount == 1.0)
-    model_->set_expanded_on_open(expanded_amount == 1.0);
+    model_->set_expanded_on_open(
+        expanded_amount == 1.0
+            ? UnifiedSystemTrayModel::StateOnOpen::EXPANDED
+            : UnifiedSystemTrayModel::StateOnOpen::COLLAPSED);
 }
 
 void UnifiedSystemTrayController::ResetToCollapsedIfRequired() {
+  if (model_->IsExplicitlyExpanded())
+    return;
+
   if (features::IsUnifiedMessageCenterRefactorEnabled()) {
     if (unified_view_->feature_pods_container()->row_count() ==
         kUnifiedFeaturePodMinRows) {
diff --git a/ash/system/unified/unified_system_tray_model.cc b/ash/system/unified/unified_system_tray_model.cc
index 59527ca7..d9779da 100644
--- a/ash/system/unified/unified_system_tray_model.cc
+++ b/ash/system/unified/unified_system_tray_model.cc
@@ -87,10 +87,14 @@
 }
 
 bool UnifiedSystemTrayModel::IsExpandedOnOpen() const {
-  return expanded_on_open_ ||
+  return expanded_on_open_ != StateOnOpen::COLLAPSED ||
          Shell::Get()->accessibility_controller()->spoken_feedback_enabled();
 }
 
+bool UnifiedSystemTrayModel::IsExplicitlyExpanded() const {
+  return expanded_on_open_ == StateOnOpen::EXPANDED;
+}
+
 base::Optional<bool> UnifiedSystemTrayModel::GetNotificationExpanded(
     const std::string& notification_id) const {
   auto it = notification_changes_.find(notification_id);
diff --git a/ash/system/unified/unified_system_tray_model.h b/ash/system/unified/unified_system_tray_model.h
index bcf904b..559954e3 100644
--- a/ash/system/unified/unified_system_tray_model.h
+++ b/ash/system/unified/unified_system_tray_model.h
@@ -17,6 +17,15 @@
 // SystemTrayModel.
 class ASH_EXPORT UnifiedSystemTrayModel {
  public:
+  enum class StateOnOpen {
+    // The user has not made any changes to the quick settings state.
+    UNSET,
+    // Quick settings has been explicitly set to collapsed by the user.
+    COLLAPSED,
+    // Quick settings has been explicitly set to expanded by the user.
+    EXPANDED
+  };
+
   enum class NotificationTargetMode {
     // Notification list scrolls to the last notification.
     LAST_NOTIFICATION,
@@ -42,8 +51,13 @@
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
+  // Returns true if the tray should be expanded when initially opened.
   bool IsExpandedOnOpen() const;
 
+  // Returns true if the user explicity set the tray to its
+  // expanded state.
+  bool IsExplicitlyExpanded() const;
+
   // Returns empty if it's not manually expanded/collapsed. Otherwise, the value
   // is true if the notification is manually expanded, and false if it's
   // manually collapsed.
@@ -67,7 +81,7 @@
   float display_brightness() const { return display_brightness_; }
   float keyboard_brightness() const { return keyboard_brightness_; }
 
-  void set_expanded_on_open(bool expanded_on_open) {
+  void set_expanded_on_open(StateOnOpen expanded_on_open) {
     expanded_on_open_ = expanded_on_open;
   }
 
@@ -101,7 +115,7 @@
 
   // If UnifiedSystemTray bubble is expanded on its open. It's expanded by
   // default, and if a user collapses manually, it remembers previous state.
-  bool expanded_on_open_ = true;
+  StateOnOpen expanded_on_open_ = StateOnOpen::UNSET;
 
   // The last value of the display brightness slider. Between 0.0 and 1.0.
   float display_brightness_ = 1.f;
diff --git a/base/third_party/symbolize/BUILD.gn b/base/third_party/symbolize/BUILD.gn
index 0dc7c2f..b83ea993 100644
--- a/base/third_party/symbolize/BUILD.gn
+++ b/base/third_party/symbolize/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chromecast_build.gni")
 import("//build/config/compiler/compiler.gni")
 
 declare_args() {
@@ -10,7 +11,13 @@
   # tools/valgrind/asan/asan_symbolize.py. By piping stderr through this script,
   # and also enabling symbol_level = 2, you can get much more detailed stack
   # traces with file names and line numbers, even in non-ASAN builds.
-  print_unsymbolized_stack_traces = is_asan || is_lsan || is_msan || is_tsan
+  #
+  # It's useful to enable this by default for builds that will be stripped
+  # before being run (e.g. chromecast cross-compiled builds); this results in
+  # more consistent output after processing with asan_symbolize.py.
+  print_unsymbolized_stack_traces =
+      is_asan || is_lsan || is_msan || is_tsan ||
+      (is_chromecast && current_toolchain != host_toolchain)
 }
 
 static_library("symbolize") {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index a0862fd..872563c 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -34,10 +34,6 @@
   _sanitizer_runtimes = [ "$clang_base_path/lib/clang/$clang_version/lib/linux/libclang_rt.ubsan_standalone-$_sanitizer_arch-android.so" ]
 }
 
-if (is_hwasan && !hwasan_platform) {
-  _sanitizer_runtimes = [ "$clang_base_path/lib/clang/$clang_version/lib/linux/libclang_rt.hwasan-$_sanitizer_arch-android.so" ]
-}
-
 # Creates a dist directory for a native executable.
 #
 # Running a native executable on a device requires all the shared library
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn
index 65feeba5..e83c2f3b 100644
--- a/build/config/sanitizers/BUILD.gn
+++ b/build/config/sanitizers/BUILD.gn
@@ -437,9 +437,6 @@
   if (is_hwasan) {
     asmflags = [ "-fsanitize=hwaddress" ]
     cflags = [ "-fsanitize=hwaddress" ]
-    if (hwasan_platform) {
-      cflags += [ "-fsanitize-hwaddress-abi=platform" ]
-    }
   }
 }
 
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni
index d96cd30..5287ebf6 100644
--- a/build/config/sanitizers/sanitizers.gni
+++ b/build/config/sanitizers/sanitizers.gni
@@ -16,10 +16,6 @@
   # See http://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html
   is_hwasan = false
 
-  # Specify whether to target the platform's copy of the HWASan runtime,
-  # rather than one bundled with the application.
-  hwasan_platform = false
-
   # Compile for Leak Sanitizer to find leaks.
   is_lsan = false
 
@@ -122,7 +118,6 @@
   is_asan = false
   is_cfi = false
   is_hwasan = false
-  hwasan_platform = false
   is_lsan = false
   is_msan = false
   is_tsan = false
@@ -247,9 +242,6 @@
         "Chromium mac_clang_x64 toolchain on iOS distribution. Please set " +
         "the argument value to false.")
 
-assert(!hwasan_platform || is_hwasan,
-       "hwasan_platform requires is_hwasan to be set")
-
 # Use these lists of configs to disable instrumenting code that is part of a
 # fuzzer, but which isn't being targeted (such as libprotobuf-mutator, *.pb.cc
 # and libprotobuf when they are built as part of a proto fuzzer). Adding or
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 04a8891..1b0218d 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8891823804487142272
\ No newline at end of file
+8891801759347717888
\ No newline at end of file
diff --git a/chrome/VERSION b/chrome/VERSION
index fdff123..9b691c3 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=81
 MINOR=0
-BUILD=4022
+BUILD=4023
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 0ee88c8..3d1102aa 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1364,9 +1364,6 @@
   "java/src/org/chromium/chrome/browser/services/gcm/GcmUma.java",
   "java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java",
   "java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
-  "java/src/org/chromium/chrome/browser/settings/ButtonPreference.java",
-  "java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java",
-  "java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java",
   "java/src/org/chromium/chrome/browser/settings/ExpandablePreferenceGroup.java",
   "java/src/org/chromium/chrome/browser/settings/HyperlinkPreference.java",
   "java/src/org/chromium/chrome/browser/settings/LearnMorePreference.java",
@@ -1378,7 +1375,6 @@
   "java/src/org/chromium/chrome/browser/settings/SettingsLauncher.java",
   "java/src/org/chromium/chrome/browser/settings/SpinnerPreference.java",
   "java/src/org/chromium/chrome/browser/settings/TextAndButtonPreference.java",
-  "java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java",
   "java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferenceOSVersion.java",
   "java/src/org/chromium/chrome/browser/settings/about/AboutChromeSettings.java",
   "java/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridge.java",
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
index 810f05ec..b535472 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -258,6 +258,9 @@
 
     @Override
     public void setOverviewState(@OverviewModeState int state) {
+        // TODO(crbug.com/1039691): Refactor into state and trigger to separate SHOWING and SHOWN
+        // states.
+
         if (mPropertyModel == null || state == mOverviewModeState) return;
 
         // Cache previous state.
@@ -269,16 +272,15 @@
         setOverviewStateInternal();
 
         // Immediately transition from SHOWING to SHOWN state if overview is visible but state not
-        // SHOWN.
+        // SHOWN. This is only necessary when the new state is a SHOWING state.
         if (mPropertyModel.get(IS_SHOWING_OVERVIEW)
-                && mOverviewModeState != OverviewModeState.NOT_SHOWN) {
-            // Compute SHOWN state.
+                && mOverviewModeState != OverviewModeState.NOT_SHOWN
+                && !isShownState(mOverviewModeState)) {
+            // Compute SHOWN state before updating previous state, because the previous state is
+            // still needed to compute the shown state.
             @OverviewModeState
             int shownState = computeOverviewStateShown();
 
-            // Nothing to do here.
-            if (shownState == mOverviewModeState) return;
-
             // Cache previous state
             mPreviousOverviewModeState = mOverviewModeState;
 
@@ -286,11 +288,25 @@
             setOverviewStateInternal();
         }
         notifyStateChange();
+
+        // Metrics collection
+        if (mOverviewModeState == OverviewModeState.SHOWN_HOMEPAGE) {
+            RecordUserAction.record("StartSurface.SinglePane.Home");
+        } else if (mOverviewModeState == OverviewModeState.SHOWN_TABSWITCHER) {
+            RecordUserAction.record("StartSurface.SinglePane.Tabswitcher");
+        } else if (mOverviewModeState == OverviewModeState.SHOWN_TABSWITCHER_TWO_PANES) {
+            RecordUserAction.record("StartSurface.TwoPanes");
+            String defaultOnUserActionString = mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE)
+                    ? "ExploreSurface"
+                    : "HomeSurface";
+            RecordUserAction.record("StartSurface.TwoPanes.DefaultOn" + defaultOnUserActionString);
+        } else if (mOverviewModeState == OverviewModeState.SHOWN_TABSWITCHER_TASKS_ONLY) {
+            RecordUserAction.record("StartSurface.TasksOnly");
+        }
     }
 
     private void setOverviewStateInternal() {
         if (mOverviewModeState == OverviewModeState.SHOWN_HOMEPAGE) {
-            RecordUserAction.record("StartSurface.SinglePane");
             setExploreSurfaceVisibility(!mIsIncognito);
             setTabCarouselVisibility(
                     mTabModelSelector.getModel(false).getCount() > 0 && !mIsIncognito);
@@ -311,12 +327,6 @@
             setSecondaryTasksSurfaceVisibility(true);
 
         } else if (mOverviewModeState == OverviewModeState.SHOWN_TABSWITCHER_TWO_PANES) {
-            RecordUserAction.record("StartSurface.TwoPanes");
-            String defaultOnUserActionString = mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE)
-                    ? "ExploreSurface"
-                    : "HomeSurface";
-            RecordUserAction.record("StartSurface.TwoPanes.DefaultOn" + defaultOnUserActionString);
-
             // Show Explore Surface if last visible pane explore.
             setExploreSurfaceVisibility(
                     ReturnToStartSurfaceUtil.shouldShowExploreSurface() && !mIsIncognito);
@@ -329,7 +339,6 @@
             mPropertyModel.set(IS_BOTTOM_BAR_VISIBLE, !mIsIncognito);
 
         } else if (mOverviewModeState == OverviewModeState.SHOWN_TABSWITCHER_TASKS_ONLY) {
-            RecordUserAction.record("StartSurface.TasksOnly");
             setMVTilesVisibility(!mIsIncognito);
             setExploreSurfaceVisibility(false);
             setFakeBoxVisibility(true);
@@ -368,6 +377,7 @@
     public void showOverview(boolean animate) {
         // TODO(crbug.com/982018): Animate the bottom bar together with the Tab Grid view.
         if (mPropertyModel != null) {
+            RecordUserAction.record("StartSurface.Shown");
 
             // update incognito
             mIsIncognito = mTabModelSelector.isIncognitoSelected();
@@ -464,6 +474,8 @@
             if (mFullScreenListener != null) {
                 mFullScreenManager.removeListener(mFullScreenListener);
             }
+            setOverviewState(OverviewModeState.NOT_SHOWN);
+            RecordUserAction.record("StartSurface.Hidden");
         }
         for (StartSurface.OverviewModeObserver observer : mObservers) {
             observer.startedHiding();
@@ -472,7 +484,6 @@
 
     @Override
     public void finishedHiding() {
-        setOverviewState(OverviewModeState.NOT_SHOWN);
         for (StartSurface.OverviewModeObserver observer : mObservers) {
             observer.finishedHiding();
         }
@@ -496,8 +507,8 @@
             assert mSecondaryTasksSurfacePropertyModel != null;
         }
 
-        setOverviewState(OverviewModeState.SHOWN_TABSWITCHER);
         RecordUserAction.record("StartSurface.SinglePane.MoreTabs");
+        setOverviewState(OverviewModeState.SHOWN_TABSWITCHER);
     }
 
     /** This interface builds the feed surface coordinator when showing if needed. */
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
index de90f99f..2470a351 100644
--- a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
+++ b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -501,7 +501,7 @@
         assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(true));
         assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false));
 
-        mediator.finishedHiding();
+        mediator.startedHiding();
         assertThat(mediator.getOverviewState(), equalTo(OverviewModeState.NOT_SHOWN));
         assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false));
     }
@@ -562,7 +562,7 @@
         assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true));
 
         mediator.hideOverview(false);
-        mediator.finishedHiding();
+        mediator.startedHiding();
         assertThat(mediator.getOverviewState(), equalTo(OverviewModeState.NOT_SHOWN));
         assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false));
     }
diff --git a/chrome/android/features/tab_ui/java/res/drawable/ic_arrow_right.xml b/chrome/android/features/tab_ui/java/res/drawable/ic_arrow_right.xml
deleted file mode 100644
index a0de3e9..0000000
--- a/chrome/android/features/tab_ui/java/res/drawable/ic_arrow_right.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2019 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. -->
-
-<vector xmlns:tools="http://schemas.android.com/tools" tools:targetApi="21"
-    android:autoMirrored="true" android:height="24dp"
-    android:viewportHeight="24" android:viewportWidth="24"
-    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="@color/default_icon_color" android:pathData="M8.59,16.59L13.17,12L8.59,7.41L10,6l6,6l-6,6L8.59,16.59z"/>
-</vector>
diff --git a/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
index d704ce8..02fa3b24 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
@@ -57,20 +57,17 @@
                 android:singleLine="true"
                 android:textAppearance="@style/TextAppearance.BlackTitle2"
                 android:text="@string/tab_switcher_carousel_title" />
-            <org.chromium.ui.widget.ChromeImageView
+            <TextView
                 android:id="@+id/more_tabs"
-                android:layout_width="48dp"
-                android:layout_height="48dp"
-                android:layout_gravity="center_vertical|end"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
                 android:layout_marginTop="-16dp"
                 android:layout_marginBottom="-16dp"
-                android:scaleType="center"
-                app:srcCompat="@drawable/ic_arrow_right"
-                android:tint="@color/default_icon_color"
-                android:tintMode="src_in"
                 android:paddingTop="16dp"
                 android:paddingBottom="16dp"
-                android:contentDescription="@string/accessibility_tab_switcher_carousel_more_tabs"/>
+                android:paddingEnd="12dp"
+                android:textAppearance="@style/TextAppearance.BlueLink3"
+                android:text="@string/tab_switcher_carousel_view_all"/>
         </LinearLayout>
         <!-- TODO(crbug.com/982018): Make view stub to inflate only when needed. -->
         <FrameLayout
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
index cb1745ad..d84dbe6d 100644
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
+++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
@@ -249,8 +249,8 @@
       <message name="IDS_TAB_SWITCHER_CAROUSEL_TITLE" desc="Title of the Tabs carousel section on the single pane start surface.">
           Continue browsing
       </message>
-      <message name="IDS_ACCESSIBILITY_TAB_SWITCHER_CAROUSEL_MORE_TABS" desc="Accessibility message of the more Tabs button on the single pane start surface.">
-          More tabs
+      <message name="IDS_TAB_SWITCHER_CAROUSEL_VIEW_ALL" desc="Title of the text view button in the Tabs carousel section on the single pane start surface. Click it to view all the existing Tabs.">
+          View all
       </message>
 
       <!-- Tab Suggestion strings -->
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SWITCHER_CAROUSEL_VIEW_ALL.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SWITCHER_CAROUSEL_VIEW_ALL.png.sha1
new file mode 100644
index 0000000..553e01a
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SWITCHER_CAROUSEL_VIEW_ALL.png.sha1
@@ -0,0 +1 @@
+b80019f5c1f74e2e6892fb5336fe7c7e3bfa97e5
\ No newline at end of file
diff --git a/chrome/android/java/res/values-v21/styles.xml b/chrome/android/java/res/values-v21/styles.xml
index b6bccb51..485cdcbc 100644
--- a/chrome/android/java/res/values-v21/styles.xml
+++ b/chrome/android/java/res/values-v21/styles.xml
@@ -32,16 +32,6 @@
         <item name="android:paddingEnd">0dp</item>
     </style>
 
-    <style name="PreferenceLayoutBase">
-        <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
-        <item name="android:minHeight">?android:attr/listPreferredItemHeightSmall</item>
-        <item name="android:paddingTop">16dp</item>
-        <item name="android:paddingBottom">16dp</item>
-        <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
-        <item name="android:paddingEnd">?android:attr/listPreferredItemPaddingEnd</item>
-    </style>
-    <style name="PreferenceLayout" parent="PreferenceLayoutBase" />
-
     <!-- Web Notifications -->
     <style name="WebNotificationTitle"
         parent="@android:style/TextAppearance.Material.Notification.Title"/>
diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res/values/styles.xml
index 5af3d88e..5661c76e 100644
--- a/chrome/android/java/res/values/styles.xml
+++ b/chrome/android/java/res/values/styles.xml
@@ -243,15 +243,6 @@
         <item name="android:paddingStart">@dimen/pref_autofill_content_spacing</item>
         <item name="android:paddingEnd">@dimen/pref_autofill_content_spacing</item>
     </style>
-    <style name="PreferenceLayoutBase">
-        <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
-        <item name="android:minHeight">?android:attr/listPreferredItemHeight</item>
-        <item name="android:paddingTop">6dp</item>
-        <item name="android:paddingBottom">6dp</item>
-        <item name="android:paddingStart">8dp</item>
-        <item name="android:paddingEnd">8dp</item>
-    </style>
-    <style name="PreferenceLayout" parent="PreferenceLayoutBase" />
     <style name="PreferenceSpinnerItem">
         <item name="android:textAppearance">@style/TextAppearance.PreferenceMediumText</item>
     </style>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
index e4ce254..c907e91f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
@@ -54,6 +54,7 @@
     private EphemeralTabSheetContent mSheetContent;
     private boolean mIsIncognito;
     private String mUrl;
+    private int mCurrentMaxSheetHeight;
 
     /**
      * Constructor.
@@ -171,8 +172,14 @@
     public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft,
             int oldTop, int oldRight, int oldBottom) {
         if (mSheetContent == null) return;
-        if ((oldBottom - oldTop) == (bottom - top)) return;
-        mSheetContent.updateContentHeight(getMaxSheetHeight());
+
+        // It may not be possible to update the content height when the actual height changes
+        // due to the current tab not being ready yet. Try it later again when the tab
+        // (hence MaxSheetHeight) becomes valid.
+        int maxSheetHeight = getMaxSheetHeight();
+        if (maxSheetHeight == 0 || mCurrentMaxSheetHeight == maxSheetHeight) return;
+        mSheetContent.updateContentHeight(maxSheetHeight);
+        mCurrentMaxSheetHeight = maxSheetHeight;
     }
 
     private int getMaxSheetHeight() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/OWNERS
index 906bc109..99d19d8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/OWNERS
@@ -1,5 +1,4 @@
 nyquist@chromium.org
 yfriedman@chromium.org
-zea@chromium.org
 
 # COMPONENT: Services>Invalidation
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
index 4ee78c7..c172d317 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -22,7 +22,6 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.MenuOrKeyboardActionController;
 import org.chromium.chrome.browser.TabThemeColorProvider;
-;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
index 2c63e671..b3fc290a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
@@ -23,6 +23,9 @@
 import org.chromium.content_public.browser.WebContentsStatics;
 import org.chromium.mojo.system.MojoException;
 
+import java.util.LinkedList;
+import java.util.Queue;
+
 /**
  * Android implementation of the authenticator.mojom interface.
  */
@@ -41,8 +44,12 @@
             .Callback2<Integer, MakeCredentialAuthenticatorResponse> mMakeCredentialCallback;
     private org.chromium.mojo.bindings.Callbacks
             .Callback2<Integer, GetAssertionAuthenticatorResponse> mGetAssertionCallback;
-    private org.chromium.mojo.bindings.Callbacks
-            .Callback1<Boolean> mIsUserVerifyingPlatformAuthenticatorAvailableCallback;
+    // A queue is used to store pending IsUserVerifyingPlatformAuthenticatorAvailable request
+    // callbacks when there are multiple requests pending on the result from GMSCore. Noted that
+    // the callbacks may not be invoked in the same order as the pending requests, which in this
+    // situation does not matter because all pending requests will return the same value.
+    private Queue<org.chromium.mojo.bindings.Callbacks.Callback1<Boolean>>
+            mIsUserVerifyingPlatformAuthenticatorAvailableCallbackQueue = new LinkedList<>();
 
     /**
      * Builds the Authenticator service implementation.
@@ -111,7 +118,7 @@
 
         if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME)
                 >= GMSCORE_MIN_VERSION_ISUVPAA) {
-            mIsUserVerifyingPlatformAuthenticatorAvailableCallback = callback;
+            mIsUserVerifyingPlatformAuthenticatorAvailableCallbackQueue.add(callback);
             Fido2ApiHandler.getInstance().isUserVerifyingPlatformAuthenticatorAvailable(
                     mRenderFrameHost, this);
         } else if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME)
@@ -151,9 +158,8 @@
 
     @Override
     public void onIsUserVerifyingPlatformAuthenticatorAvailableResponse(boolean isUVPAA) {
-        assert mIsUserVerifyingPlatformAuthenticatorAvailableCallback != null;
-        mIsUserVerifyingPlatformAuthenticatorAvailableCallback.call(isUVPAA);
-        mIsUserVerifyingPlatformAuthenticatorAvailableCallback = null;
+        assert !mIsUserVerifyingPlatformAuthenticatorAvailableCallbackQueue.isEmpty();
+        mIsUserVerifyingPlatformAuthenticatorAvailableCallbackQueue.poll().call(isUVPAA);
     }
 
     @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
index 99b6aecc..f4a3ef9f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
@@ -24,7 +24,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
@@ -187,7 +186,6 @@
 
     @Test
     @SmallTest
-    @FlakyTest(message = "https://crbug.com/1020381")
     @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
     public void testShowingVoiceSearchButtonIfUrlBarIsEmpty() throws ExecutionException {
         setUrlBarTextAndFocus("");
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 62b8877..e62c960 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-81.0.4016.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-81.0.4019.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index d6aef1b..ca6f766 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -4097,58 +4097,58 @@
   <message name="IDS_PLUGIN_VM_APP_NAME" desc="Name of the 'Plugin VM' app.">
     Plugin VM
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_ENVIRONMENT_SETTING_TITLE" desc="Title of the Plugin VM installer during installation.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_ENVIRONMENT_SETTING_TITLE" desc="Title of the Plugin VM installer during installation.">
     Setting up Plugin VM...
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_FINISHED_TITLE" desc="Title of the Plugin VM installer after successful installation.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_FINISHED_TITLE" desc="Title of the Plugin VM installer after successful installation.">
     Setup complete
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_ERROR_TITLE" desc="Title of the Plugin VM installer if there was an error during installation.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_TITLE" desc="Title of the Plugin VM installer if there was an error during installation.">
     Setup couldn't complete
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_TITLE" desc="Title of the Plugin VM installer if Plugin VM is disallowed.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_TITLE" desc="Title of the Plugin VM installer if Plugin VM is disallowed.">
     Plugin VM needs permission to run
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_START_DOWNLOADING_MESSAGE" desc="Text of the Plugin VM installer that informs the user that setup may take a while.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_START_DOWNLOADING_MESSAGE" desc="Text of the Plugin VM installer that informs the user that setup may take a while.">
     This may take awhile
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_DOWNLOADING_MESSAGE" desc="Text of the Plugin VM installer while downloading the VM.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_DOWNLOADING_MESSAGE" desc="Text of the Plugin VM installer while downloading the VM.">
     Downloading the virtual machine
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_IMPORTING_MESSAGE" desc="Text of the Plugin VM installer while configuring the VM.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_IMPORTING_MESSAGE" desc="Text of the Plugin VM installer while configuring the VM.">
     Configuring the virtual machine. This may take a few minutes.
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_FINISHED_MESSAGE" desc="Text of the Plugin VM installer after successful installation.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_FINISHED_MESSAGE" desc="Text of the Plugin VM installer after successful installation.">
     Plugin VM is ready to use
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_LOGIC_ERROR" desc="Text of the Plugin VM installer if the installation failed due to an internal error.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_LOGIC_ERROR" desc="Text of the Plugin VM installer if the installation failed due to an internal error.">
     Couldn't install Plugin VM. Please try again, or contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_CONFIG_ERROR" desc="Text of the Plugin VM installer if the installation failed because there was an error in the configuration.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_CONFIG_ERROR" desc="Text of the Plugin VM installer if the installation failed because there was an error in the configuration.">
     Couldn't set up Plugin VM because of a configuration problem. Please contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_DOWNLOAD_FAILED" desc="Text of the Plugin VM installer if the installation failed because something went wrong while downloading the virtual machine.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_FAILED" desc="Text of the Plugin VM installer if the installation failed because something went wrong while downloading the virtual machine.">
     Couldn't install the virtual machine because of a network error. Please try again, or contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_INSTALLING_FAILED" desc="Text of the Plugin VM installer if the installation failed because downloaded Plugin VM could not be installed.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_INSTALLING_FAILED" desc="Text of the Plugin VM installer if the installation failed because downloaded Plugin VM could not be installed.">
     Couldn't install the virtual machine. Please try again, or contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_MESSAGE" desc="Error message to be shown if a setup/launch is attempted although Plugin VM is disallowed.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE" desc="Error message to be shown if a setup/launch is attempted although Plugin VM is disallowed.">
     Plugin VM isn't allowed on this device. Contact your organization's device administrator.
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_MESSAGE" desc="Text of the Plugin VM installer during downloading Plugin VM image, showing download progress.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_MESSAGE" desc="Text of the Plugin VM installer during downloading Plugin VM image, showing download progress.">
     <ph name="DOWNLOADED_SIZE">$1<ex>1.2</ex></ph>/<ph name="DOWNLOAD_SIZE">$2<ex>3.4 GB</ex></ph>
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE" desc="Text of the Plugin VM installer while downloading Plugin VM image, showing download progress when the full download size is not known.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE" desc="Text of the Plugin VM installer while downloading Plugin VM image, showing download progress when the full download size is not known.">
     <ph name="DOWNLOADED_SIZE">$1<ex>1.2 GB</ex></ph>
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_TIME_LEFT_MESSAGE" desc="Text of the Plugin VM installer that shows estimated time left before current installation stage ends.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE" desc="Text of the Plugin VM installer that shows estimated time left before current installation stage ends.">
     <ph name="TIME_LEFT">$1<ex>30 mins</ex></ph> left
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_LAUNCH_BUTTON" desc="Label for the button in the Plugin VM installer to launch Plugin VM after successful installation.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_LAUNCH_BUTTON" desc="Label for the button in the Plugin VM installer to launch Plugin VM after successful installation.">
     Launch
   </message>
-  <message name="IDS_PLUGIN_VM_LAUNCHER_RETRY_BUTTON" desc="Label for the button in the Plugin VM installer to retry installation on failure.">
+  <message name="IDS_PLUGIN_VM_INSTALLER_RETRY_BUTTON" desc="Label for the button in the Plugin VM installer to retry installation on failure.">
     Retry
   </message>
   <message name="IDS_PLUGIN_VM_SHUT_DOWN_MENU_ITEM" desc="Text shown in the launcher and shelf context menus for the Plugin VM app to shut it down.">
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_DOWNLOADING_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_DOWNLOADING_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_DOWNLOADING_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_DOWNLOADING_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_ENVIRONMENT_SETTING_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ENVIRONMENT_SETTING_TITLE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_ENVIRONMENT_SETTING_TITLE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ENVIRONMENT_SETTING_TITLE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_ERROR_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_TITLE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_ERROR_TITLE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_TITLE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_FINISHED_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_FINISHED_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_FINISHED_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_FINISHED_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_FINISHED_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_FINISHED_TITLE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_FINISHED_TITLE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_FINISHED_TITLE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_IMPORTING_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_IMPORTING_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_IMPORTING_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_IMPORTING_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_LAUNCH_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_LAUNCH_BUTTON.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_LAUNCH_BUTTON.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_LAUNCH_BUTTON.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_RETRY_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_RETRY_BUTTON.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_RETRY_BUTTON.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_RETRY_BUTTON.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_START_DOWNLOADING_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_START_DOWNLOADING_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_START_DOWNLOADING_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_START_DOWNLOADING_MESSAGE.png.sha1
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_TIME_LEFT_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE.png.sha1
similarity index 100%
rename from chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_LAUNCHER_TIME_LEFT_MESSAGE.png.sha1
rename to chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE.png.sha1
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 19c0e89..61ed541 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -648,7 +648,7 @@
       </if>
 
       <!-- about:browser-switch strings -->
-      <if expr="is_win or is_macosx or (is_linux and not is_chromeos)">
+      <if expr="is_win or is_macosx or (is_linux and not chromeos)">
         <message name="IDS_ABOUT_BROWSER_SWITCH_DESCRIPTION_UNKNOWN_BROWSER" desc="Description shown while waiting for an alternative browser to open, when the browser name is not auto-detected">
           Your system administrator has configured Chromium to open an alternative browser to access <ph name="TARGET_URL_HOSTNAME">$1<ex>example.com</ex></ph>.
         </message>
diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp
index a9a94ad..a95deb2a 100644
--- a/chrome/app/extensions_strings.grdp
+++ b/chrome/app/extensions_strings.grdp
@@ -19,6 +19,9 @@
   <message name="IDS_EXTENSIONS_CORRUPTED_EXTENSION" desc="The warning for the user that an extension may have been tampered with on disk.">
     This extension may have been corrupted.
   </message>
+  <message name="IDS_EXTENSIONS_ENABLE_BUTTON" desc="The text displayed on the enable button when the extension is disabled pending custodian approval on the chrome://extensions page">
+    Enable
+  </message>
   <message name="IDS_EXTENSIONS_ENABLE_ERROR_COLLECTION" desc="The checkbox for enabling error collection for an extension.">
     Collect errors
   </message>
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ENABLE_BUTTON.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ENABLE_BUTTON.png.sha1
new file mode 100644
index 0000000..301528a
--- /dev/null
+++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ENABLE_BUTTON.png.sha1
@@ -0,0 +1 @@
+f2a24389c19c6a880a5f1e7266d47e6e70b874b0
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 8ad0add6..d5ee653 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5066,7 +5066,7 @@
       </if>
 
       <!-- chrome://browser-switch strings -->
-      <if expr="is_win or is_macosx or (is_linux and not is_chromeos)">
+      <if expr="is_win or is_macosx or (is_linux and not chromeos)">
         <message name="IDS_ABOUT_BROWSER_SWITCH_TITLE" desc="about:browser-switch page title">
           Legacy Browser Support
         </message>
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 3c22663..885b623 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -660,7 +660,7 @@
       </if>
 
       <!-- about:browser-switch strings -->
-      <if expr="is_win or is_macosx or (is_linux and not is_chromeos)">
+      <if expr="is_win or is_macosx or (is_linux and not chromeos)">
         <message name="IDS_ABOUT_BROWSER_SWITCH_DESCRIPTION_UNKNOWN_BROWSER" desc="Description shown while waiting for an alternative browser to open, when the browser name is not auto-detected">
           Your system administrator has configured Google Chrome to open an alternative browser to access <ph name="TARGET_URL_HOSTNAME">$1<ex>example.com</ex></ph>.
         </message>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index 5a998cb3..a28fb2a0 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Kleinkiekie verwyder.</translation>
 <translation id="8252569384384439529">Laai tans op …</translation>
 <translation id="8253198102038551905">Klik '+' om netwerkeienskappe te kry</translation>
-<translation id="825483282309623688">Jy moet 'n internetverbinding hê om jou data te herwin.</translation>
 <translation id="8254954272268479918">Maak Linux (Beta) toe</translation>
 <translation id="8255451560461371599">Geen agtergrond nie</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 35f70acd..da2994bf 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">ድንክዬ ተወግዷል።</translation>
 <translation id="8252569384384439529">በመስቀል ላይ…</translation>
 <translation id="8253198102038551905">የአውታረ መረብ ባህሪያትን ለማግኘት «+»ን ጠቅ ያድርጉ።</translation>
-<translation id="825483282309623688">የእርስዎን ውሂብ ወደነበረበት ለመመለስ የበይነመረብ ግንኙነት ያስፈልገዎታል።</translation>
 <translation id="8254954272268479918">Linux (ቅድመ-ይሁንታ)ን ዝጋ</translation>
 <translation id="8255451560461371599">ምንም ጀርባ የለም</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 3a482e5..4964d9d 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -243,7 +243,7 @@
 <translation id="1329584516321524826">تم التحديث الآن</translation>
 <translation id="1330145147221172764">تفعيل لوحة المفاتيح على الشاشة</translation>
 <translation id="1331977651797684645">كان هذا أنا.</translation>
-<translation id="1333489022424033687">قد لا تعمل بعض ميزات<ph name="ORIGIN" /> حتى تقوم بمحو البيانات التي خزّنتها المواقع الإلكترونية الأخرى على جهازك.</translation>
+<translation id="1333489022424033687">قد لا تعمل بعض ميزات <ph name="ORIGIN" /> حتى تقوم بمحو البيانات التي خزّنتها المواقع الإلكترونية الأخرى على جهازك.</translation>
 <translation id="133535873114485416">الإدخال المفضَّل</translation>
 <translation id="1335929031622236846">تسجيل الجهاز</translation>
 <translation id="1338802252451106843">يريد <ph name="ORIGIN" /> فتح هذا التطبيق.</translation>
@@ -2554,7 +2554,7 @@
 <translation id="4611114513649582138">اتصال البيانات متاح</translation>
 <translation id="4613144866899789710">‏جارٍ إلغاء عملية تثبيت Linux...</translation>
 <translation id="4613271546271159013">لقد غيّرت الإضافة الصفحة المعروضة عندما فتحت علامة تبويب جديدة.</translation>
-<translation id="4615586811063744755">لم يتم تحديد أي ملفات تعريف ارتباط.</translation>
+<translation id="4615586811063744755">لم يتم اختيار أي ملفات تعريف ارتباط.</translation>
 <translation id="4617001782309103936">قصير جدًا</translation>
 <translation id="4617270414136722281">خيارات الإضافات</translation>
 <translation id="4619615317237390068">علامات التبويب من الأجهزة الأخرى</translation>
@@ -2828,7 +2828,7 @@
 <translation id="5033266061063942743">الأشكال الهندسية</translation>
 <translation id="503498442187459473">يريد <ph name="HOST" /> استخدام الكاميرا والميكروفون.</translation>
 <translation id="5036662165765606524">عدم السماح لأي موقع بتنزيل عدة ملفات تلقائيًا</translation>
-<translation id="5037676449506322593">تحديد الكل</translation>
+<translation id="5037676449506322593">اختيار الكل</translation>
 <translation id="5038022729081036555">يمكنك استخدامه لمدة <ph name="TIME_LIMIT" /> غدًا.</translation>
 <translation id="5038863510258510803">جارٍ التمكين...</translation>
 <translation id="5039804452771397117">سماح</translation>
@@ -4106,7 +4106,7 @@
 <translation id="6892812721183419409">فتح الرابط كـ <ph name="USER" /></translation>
 <translation id="6895032998810961280">‏إبلاغ Google بالتفاصيل حول البرامج الضارّة وإعدادات النظام والعمليات التي تم العثور عليها على جهاز الكمبيوتر أثناء إزالة البرامج غير المرغوب فيها.</translation>
 <translation id="6896758677409633944">نسخ</translation>
-<translation id="6897363604023044284">اختر المواقع الإلكترونية التي ترغب بمحوها</translation>
+<translation id="6897363604023044284">اختيار المواقع الإلكترونية لمحوها</translation>
 <translation id="6898440773573063262">الآن، يمكن تهيئة تطبيقات الكشك للبدء التلقائي على هذا الجهاز.</translation>
 <translation id="6898699227549475383">‏المؤسسة (O)</translation>
 <translation id="6900284862687837908">تطبيق الخلفية: <ph name="BACKGROUND_APP_URL" /></translation>
@@ -5063,7 +5063,7 @@
 <translation id="8218847192766059983">يمكنك إضافة اللغات أو إعادة ترتيب القائمة. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="8221491193165283816">أنت تحظر الإشعارات عادةً. للسماح لهذا الموقع الإلكتروني بإرسال إشعارات لك، انقر هنا.</translation>
 <translation id="8225265270453771718">مشاركة نافذة التطبيق</translation>
-<translation id="8225753906568652947">استرداد قيمة العروض</translation>
+<translation id="8225753906568652947">تحصيل قيمة العروض</translation>
 <translation id="8226222018808695353">محظور </translation>
 <translation id="8226619461731305576">اللائحة</translation>
 <translation id="8226742006292257240">‏في ما يلي كلمة مرور TPM التي تم إنشاؤها عشوائيًا والتي تم تخصيصها للكمبيوتر:</translation>
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">تمت إزالة الصورة المصغّرة.</translation>
 <translation id="8252569384384439529">جارٍ التحميل...</translation>
 <translation id="8253198102038551905">انقر '+' للحصول على خصائص الشبكة</translation>
-<translation id="825483282309623688">لاستعادة بياناتك، تحتاج إلى اتصال بالإنترنت.</translation>
 <translation id="8254954272268479918">‏إيقاف تطبيق Linux (إصدار تجريبي)</translation>
 <translation id="8255451560461371599">لا تتوفر خلفية</translation>
 <translation id="8256319818471787266">اللامع</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 5694a1630..a450a3da 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -5050,7 +5050,6 @@
 <translation id="8251578425305135684">থাম্বনেইল আঁতৰোৱা হ'ল।</translation>
 <translation id="8252569384384439529">আপল’ড কৰি থকা হৈছে...</translation>
 <translation id="8253198102038551905">নেটৱর্কৰ বৈশিষ্ট্যসমূহ পাবলৈ ‘+’ ত ক্লিক কৰক</translation>
-<translation id="825483282309623688">আপোনাৰ ডেটা পুনঃস্থাপন কৰিবলৈ আপোনাক ইণ্টাৰনেট সংযোগৰ প্ৰয়োজন।</translation>
 <translation id="8254954272268479918">Linux বন্ধ কৰক (বিটা)</translation>
 <translation id="8255451560461371599">নেপথ্যত একো নাই</translation>
 <translation id="8256319818471787266">স্পাৰ্কী</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index e8e17eb..60dcf17 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -5078,7 +5078,6 @@
 <translation id="8251578425305135684">Eskiz silindi.</translation>
 <translation id="8252569384384439529">Yüklənir...</translation>
 <translation id="8253198102038551905">Şəbəkə xüsusiyyətlərini əldə etmək üçün '+' klikləyin</translation>
-<translation id="825483282309623688">Datanızı bərpa etmək üçün, İnternet bağlantısı olmalıdır.</translation>
 <translation id="8254954272268479918">Linux'u (Beta) bağlayın</translation>
 <translation id="8255451560461371599">Arxa fon yoxdur</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index a5d18ee..0cd154d 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Мініяцюра выдалена.</translation>
 <translation id="8252569384384439529">Ідзе запампоўванне...</translation>
 <translation id="8253198102038551905">Націсніце "+", каб праглядзець параметры сеткі</translation>
-<translation id="825483282309623688">Каб аднавіць вашы даныя, патрабуецца падключэнне да інтэрнэту.</translation>
 <translation id="8254954272268479918">Выключыць Linux (бэта-версія)</translation>
 <translation id="8255451560461371599">Без фону</translation>
 <translation id="8256319818471787266">Спаркі</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 684e125..b4c5c74e 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Миниизображението е премахнато.</translation>
 <translation id="8252569384384439529">Качва се...</translation>
 <translation id="8253198102038551905">Кликнете върху „+“, за да получите свойствата на мрежата</translation>
-<translation id="825483282309623688">За да възстановите данните си, трябва да имате връзка с интернет.</translation>
 <translation id="8254954272268479918">Изключване на Linux (бета)</translation>
 <translation id="8255451560461371599">Без фон</translation>
 <translation id="8256319818471787266">Спарки</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 77e281b..9cd137f 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4108,7 +4108,7 @@
 <translation id="6892812721183419409"><ph name="USER" /> হিসেবে লিঙ্ক খুলুন</translation>
 <translation id="6895032998810961280">পরিষ্কার করার সময় আপনার কম্পিউটারে পাওয়া ক্ষতিকারক সফ্টওয়্যার, সিস্টেম সেটিংস ও প্রসেসের বিবরণ Google-কে জানান।</translation>
 <translation id="6896758677409633944">কপি</translation>
-<translation id="6897363604023044284">মোছার জন্য সাইট বেছে নিন</translation>
+<translation id="6897363604023044284">কোন কোন সাইটের ডেটা মুছবেন তা বেছে নিন</translation>
 <translation id="6898440773573063262">Kiosk অ্যাপ্লিকেশনগুলিকে এখন এই ডিভাইসে স্বয়ংক্রিয়ভাবে লঞ্চ করতে কনফিগার করা যাবে৷</translation>
 <translation id="6898699227549475383">সংস্থা (O)</translation>
 <translation id="6900284862687837908">পটভূমিতে কাজ করা অ্যাপ্লিকেশান: <ph name="BACKGROUND_APP_URL" /></translation>
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">থাম্বনেল সরানো হয়েছে৷</translation>
 <translation id="8252569384384439529">আপলোড হচ্ছে…</translation>
 <translation id="8253198102038551905">নেটওয়ার্কের প্রোপাটিজ পেতে '+'-এ ক্লিক করুন</translation>
-<translation id="825483282309623688">আপনার ডেটা পুনরুদ্ধার করতে, আপনার একটি ইন্টারনেট সংযোগ প্রয়োজন।</translation>
 <translation id="8254954272268479918">Linux (বিটা) বন্ধ করুন</translation>
 <translation id="8255451560461371599">কোনও ব্যাকগ্রাউন্ড নেই</translation>
 <translation id="8256319818471787266">স্পার্কি</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 1e8dea9..94d18b1 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Sličica je uklonjena.</translation>
 <translation id="8252569384384439529">Otpremanje...</translation>
 <translation id="8253198102038551905">Klliknite na "+" da dođete do karakteristika mreže</translation>
-<translation id="825483282309623688">Za vraćanje podataka je potrebna internetska veza.</translation>
 <translation id="8254954272268479918">Isključi Linux (beta)</translation>
 <translation id="8255451560461371599">Nema pozadine</translation>
 <translation id="8256319818471787266">Reks</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index a11f4a5..00ee220 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">S'ha eliminat la miniatura.</translation>
 <translation id="8252569384384439529">S'està penjant...</translation>
 <translation id="8253198102038551905">Feu clic a "+" per consultar les propietats de la xarxa</translation>
-<translation id="825483282309623688">Per poder restaurar les dades, necessites connexió a Internet.</translation>
 <translation id="8254954272268479918">Tanca Linux (versió beta)</translation>
 <translation id="8255451560461371599">Sense fons</translation>
 <translation id="8256319818471787266">Gosset</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 6b91f442..5841e77 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">Miniatura byla odstraněna.</translation>
 <translation id="8252569384384439529">Nahrávání...</translation>
 <translation id="8253198102038551905">Vlastnosti sítě otevřete kliknutím na +.</translation>
-<translation id="825483282309623688">Obnovení dat vyžaduje připojení k internetu.</translation>
 <translation id="8254954272268479918">Ukončit Linux (beta)</translation>
 <translation id="8255451560461371599">Bez pozadí</translation>
 <translation id="8256319818471787266">Štěně</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index fb057bdf7..f367d799 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Miniaturen blev fjernet.</translation>
 <translation id="8252569384384439529">Uploader…</translation>
 <translation id="8253198102038551905">Klik på "+" for at få vist netværksegenskaber</translation>
-<translation id="825483282309623688">Du skal have internetforbindelse for at kunne gendanne dine data.</translation>
 <translation id="8254954272268479918">Luk Linux (beta)</translation>
 <translation id="8255451560461371599">Ingen baggrund</translation>
 <translation id="8256319818471787266">Fido</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index d43fe97a..4a323c41 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -5084,7 +5084,6 @@
 <translation id="8251578425305135684">Miniaturansicht wurde entfernt.</translation>
 <translation id="8252569384384439529">Wird hochgeladen…</translation>
 <translation id="8253198102038551905">Auf "+" klicken, um die Netzwerkeigenschaften anzuzeigen</translation>
-<translation id="825483282309623688">Zur Wiederherstellung Ihrer Daten benötigen Sie eine Internetverbindung.</translation>
 <translation id="8254954272268479918">Linux (Beta) herunterfahren</translation>
 <translation id="8255451560461371599">Kein Hintergrund</translation>
 <translation id="8256319818471787266">Bello</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 422e58fe..22d5fb1a 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">Η μικρογραφία καταργήθηκε.</translation>
 <translation id="8252569384384439529">Μεταφόρτωση…</translation>
 <translation id="8253198102038551905">Κάντε κλικ στο "+" για να δείτε τις ιδιότητες δικτύου</translation>
-<translation id="825483282309623688">Για να επαναφέρετε τα δεδομένα σας, θα χρειαστείτε μια σύνδεση στο διαδίκτυο.</translation>
 <translation id="8254954272268479918">Τερματισμός Linux (beta)</translation>
 <translation id="8255451560461371599">Χωρίς φόντο</translation>
 <translation id="8256319818471787266">Ζωηρός</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 5edbb33b..0cd3d94 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Thumbnail removed.</translation>
 <translation id="8252569384384439529">Uploading…</translation>
 <translation id="8253198102038551905">Click '+' to get network properties</translation>
-<translation id="825483282309623688">To restore your data, you need an Internet connection.</translation>
 <translation id="8254954272268479918">Shut down Linux (Beta)</translation>
 <translation id="8255451560461371599">No background</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 2bbae44f..443a910 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -168,7 +168,7 @@
 <translation id="1221024147024329929">PKCS N. º 1 MD2 con encriptación RSA</translation>
 <translation id="1221825588892235038">Solo selección</translation>
 <translation id="1223853788495130632">El administrador recomienda un valor específico para esta configuración.</translation>
-<translation id="1224275271335624810">A velocidad máxima</translation>
+<translation id="1224275271335624810">Más rápido</translation>
 <translation id="1225177025209879837">Procesando la solicitud...</translation>
 <translation id="1227507814927581609">Error de autenticación al establecer la conexión con "<ph name="DEVICE_NAME" />".</translation>
 <translation id="1231733316453485619">¿Quieres activar la sincronización?</translation>
@@ -208,7 +208,7 @@
 <translation id="1285320974508926690">Nunca traducir este sitio</translation>
 <translation id="1285484354230578868">Almacenar datos en tu cuenta de Google Drive</translation>
 <translation id="1288037062697528143">La Luz nocturna se activará automáticamente al atardecer</translation>
-<translation id="1288300545283011870">Propiedades de comentarios de texto a voz</translation>
+<translation id="1288300545283011870">Propiedades de voz</translation>
 <translation id="1293264513303784526">Dispositivo USB-C (puerto izquierdo)</translation>
 <translation id="1293556467332435079">Archivos</translation>
 <translation id="1296911687402551044">Fijar la pestaña seleccionada</translation>
@@ -735,7 +735,7 @@
 <translation id="2025632980034333559"><ph name="APP_NAME" /> se ha bloqueado. Haz clic en este globo para volver a cargar la extensión.</translation>
 <translation id="2025891858974379949">Contenido no seguro</translation>
 <translation id="2034346955588403444">Agregar otra red Wi-Fi</translation>
-<translation id="203574396658008164">Habilitar la toma de notas de la pantalla bloqueada</translation>
+<translation id="203574396658008164">Habilitar la toma de notas desde la pantalla bloqueada</translation>
 <translation id="2037445849770872822">Se configuró la supervisión de esta Cuenta de Google. Para configurar más controles parentales, selecciona Continuar.
 
 De lo contrario, sal de la cuenta ahora para que se reflejen los cambios en este dispositivo.
@@ -1253,7 +1253,7 @@
 <translation id="2731710757838467317">Se está creando el usuario supervisado. Esta acción puede tardar unos minutos.</translation>
 <translation id="2731971182069536520">La próxima vez que reinicies el dispositivo, tu administrador realizará una actualización única que borrará tus datos locales.</translation>
 <translation id="2734760316755174687">También se restablecerán los sitios en <ph name="SITE_GROUP_NAME" />.</translation>
-<translation id="2735712963799620190">Cronograma</translation>
+<translation id="2735712963799620190">Programar</translation>
 <translation id="2737363922397526254">Contraer...</translation>
 <translation id="2738771556149464852">No después</translation>
 <translation id="2739191690716947896">Depurar</translation>
@@ -1356,7 +1356,7 @@
 <translation id="2870909136778269686">Actualizando…</translation>
 <translation id="2871813825302180988">Esta cuenta ya está en uso en este dispositivo.</translation>
 <translation id="287286579981869940">Agregar <ph name="PROVIDER_NAME" />...</translation>
-<translation id="2872961005593481000">Cerrar</translation>
+<translation id="2872961005593481000">Apagar</translation>
 <translation id="2874478552394649323">Quitar Plugin VM</translation>
 <translation id="2874939134665556319">Pista anterior</translation>
 <translation id="2875698561019555027">(Páginas de error de Chrome)</translation>
@@ -1481,7 +1481,7 @@
 <translation id="3043581297103810752">De <ph name="ORIGIN" /></translation>
 <translation id="3045447014237878114">Este sitio descargó varios archivos automáticamente</translation>
 <translation id="3046910703532196514">Página web, completa</translation>
-<translation id="304747341537320566">Motores de comentarios de texto a voz</translation>
+<translation id="304747341537320566">Motores de voz</translation>
 <translation id="3047644958362961983">Esta información nos permite entender mejor tu problema con el Asistente. Estos datos se almacenan por 90 días. El acceso a esta información está restringido a los equipos de ingeniería y comentarios correspondientes.</translation>
 <translation id="3053013834507634016">Uso de la clave del certificado</translation>
 <translation id="3053273573829329829">Habilitar el PIN de usuario</translation>
@@ -2238,7 +2238,7 @@
 <translation id="4099874310852108874">Se produjo un error de red.</translation>
 <translation id="4100733287846229632">Hay muy poco espacio en el dispositivo</translation>
 <translation id="4100853287411968461">Nuevo límite en el horario de uso</translation>
-<translation id="4103091233824664032">Ingresa tu contraseña para configurar el bloqueo de pantalla y acceder</translation>
+<translation id="4103091233824664032">Ingresa tu contraseña para configurar el bloqueo de pantalla y el inicio de sesión</translation>
 <translation id="4104163789986725820">E&amp;xportar...</translation>
 <translation id="4107048419833779140">Identificar y expulsar los dispositivos de almacenamiento</translation>
 <translation id="4109135793348361820">Mover ventana a <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
@@ -2750,7 +2750,7 @@
 <translation id="4907306957610201395">Categoría de permiso</translation>
 <translation id="4908811072292128752">Abre una pestaña nueva para navegar en dos sitios al mismo tiempo</translation>
 <translation id="4909038193460299775">Debido a que esta cuenta la administra <ph name="DOMAIN" />, tus favoritos, historial, contraseñas y otras opciones de configuración se borrarán de este dispositivo. Sin embargo, tus datos permanecerán almacenados en tu cuenta de Google y se podrán administrar en el <ph name="BEGIN_LINK" />Panel de control de Google<ph name="END_LINK" />.</translation>
-<translation id="4909359680501173791">Te inscribiste correctamente</translation>
+<translation id="4909359680501173791">Te registraste correctamente</translation>
 <translation id="4912643508233590958">Reactivaciones</translation>
 <translation id="491691592645955587">Cambiar a un navegador seguro</translation>
 <translation id="4917385247580444890">Fuerte</translation>
@@ -3139,7 +3139,7 @@
 <translation id="5493792505296048976">pantalla encendida</translation>
 <translation id="5494362494988149300">Abrir cuan&amp;do esté listo</translation>
 <translation id="5495466433285976480">Esta acción eliminará todos los archivos, los datos y los usuarios locales, entre otros parámetros de configuración, la próxima vez que reinicies. Todos los usuarios deberán volver a acceder.</translation>
-<translation id="5495597166260341369">Mantener la pantalla encendida</translation>
+<translation id="5495597166260341369">Pantalla encendida</translation>
 <translation id="5496587651328244253">Organizar</translation>
 <translation id="5499313591153584299">Este archivo puede dañar el equipo.</translation>
 <translation id="5502500733115278303">Importado desde Firefox</translation>
@@ -3600,7 +3600,7 @@
 <translation id="6125479973208104919">Lamentablemente, debes volver a agregar tu cuenta a este dispositivo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="6129691635767514872">Los datos seleccionados se quitaron de Chrome y los dispositivos sincronizados. Es posible que tu cuenta de Google tenga otros formularios del historial de navegación, como las búsquedas y la actividad de otros servicios de Google en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="6129938384427316298">Comentario sobre el certificado Netscape</translation>
-<translation id="6129953537138746214">Google Space</translation>
+<translation id="6129953537138746214">Espacio</translation>
 <translation id="6136114942382973861">Cerrar la barra de descargas</translation>
 <translation id="6137767437444130246">Certificado del usuario</translation>
 <translation id="6138680304137685902">Firma X9.62 ECDSA con SHA-384</translation>
@@ -3762,7 +3762,7 @@
 <translation id="6362853299801475928">&amp;Cómo informar de un problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
 <translation id="6365411474437319296">Agregar familiares y amigos</translation>
-<translation id="636850387210749493">Inscripción de empresa</translation>
+<translation id="636850387210749493">Registro de empresa</translation>
 <translation id="6370021412472292592">No se pudo cargar el manifiesto.</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Volver a intentar</translation>
@@ -3960,7 +3960,7 @@
 <translation id="6676212663108450937">Considera usar auriculares mientras entrenas tu voz</translation>
 <translation id="6678717876183468697">URL de consulta</translation>
 <translation id="6680442031740878064">Disponible: <ph name="AVAILABLE_SPACE" /></translation>
-<translation id="6680650203439190394">Calificar</translation>
+<translation id="6680650203439190394">Velocidad</translation>
 <translation id="6681668084120808868">Tomar foto</translation>
 <translation id="6681964764822470072">Se desinstalará "<ph name="APP_NAME" />".</translation>
 <translation id="668599234725812620">Abrir Google Play</translation>
@@ -4033,7 +4033,7 @@
 <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> se agregó de forma remota</translation>
 <translation id="6790820461102226165">Agregar una persona…</translation>
 <translation id="6792072150955115067"><ph name="APP_NAME" /> desea compartir el contenido de tu pantalla con <ph name="TARGET_NAME" />. Elige lo que deseas compartir.</translation>
-<translation id="6793604637258913070">Destacar el cursor de texto cuando aparece o se mueve</translation>
+<translation id="6793604637258913070">Destacar el símbolo de intercalación de texto cuando aparece o se mueve</translation>
 <translation id="6795884519221689054">Panda</translation>
 <translation id="6797493596609571643">Se produjo un error.</translation>
 <translation id="6798578729981748444">Para finalizar la importación, cierra todas las ventanas de Firefox.</translation>
@@ -4682,7 +4682,7 @@
 <translation id="7721179060400456005">Permitir que las ventanas abarquen las pantallas</translation>
 <translation id="7722040605881499779">Espacio necesario para la actualización: <ph name="NECESSARY_SPACE" /></translation>
 <translation id="7724603315864178912">Cortar</translation>
-<translation id="7728570244950051353">Bloquear pantalla desde el modo de suspensión</translation>
+<translation id="7728570244950051353">Pantalla bloqueada desde el modo de suspensión</translation>
 <translation id="7728668285692163452">El cambio del canal se aplicará más tarde</translation>
 <translation id="7730449930968088409">Capturar contenido de la pantalla</translation>
 <translation id="7732111077498238432">La red está controlada por políticas</translation>
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">Miniatura eliminada.</translation>
 <translation id="8252569384384439529">Subiendo…</translation>
 <translation id="8253198102038551905">Haz clic en "+" para ver las propiedades de red.</translation>
-<translation id="825483282309623688">Para restablecer tus datos, necesitas una conexión a Internet.</translation>
 <translation id="8254954272268479918">Cerrar Linux (Beta)</translation>
 <translation id="8255451560461371599">Sin imagen de fondo</translation>
 <translation id="8256319818471787266">Bobby</translation>
@@ -5734,7 +5733,7 @@
 <translation id="9158715103698450907">Se produjo un problema de comunicación de red durante la autenticación. Verifica tu conexión de red y vuelve a intentarlo.</translation>
 <translation id="916607977885256133">Pantalla en pantalla</translation>
 <translation id="9168436347345867845">Hacerlo más tarde</translation>
-<translation id="9169496697824289689">Ver combinación de teclas para acceso directo</translation>
+<translation id="9169496697824289689">Ver combinaciones de teclas para acceso directo</translation>
 <translation id="916964310188958970">¿Por qué recibo esta sugerencia?</translation>
 <translation id="9169931577761441333">Agrega <ph name="APP_NAME" /> a la pantalla principal</translation>
 <translation id="9170305483456271385">Se quitó Plugin VM</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 701516a..577258e 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Miniatura eliminada</translation>
 <translation id="8252569384384439529">Subiendo...</translation>
 <translation id="8253198102038551905">Haz clic en + para consultar las propiedades de la red</translation>
-<translation id="825483282309623688">Necesitas conexión a Internet para restaurar tus datos.</translation>
 <translation id="8254954272268479918">Apagar Linux (beta)</translation>
 <translation id="8255451560461371599">Sin imagen de fondo</translation>
 <translation id="8256319818471787266">Perrito</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 7b4c814..8cdfb92 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Pisipilt eemaldatud.</translation>
 <translation id="8252569384384439529">Üleslaadimine …</translation>
 <translation id="8253198102038551905">Võrguatribuutide hankimiseks klõpsake märgil „+”</translation>
-<translation id="825483282309623688">Andmete taastamiseks on vaja Interneti-ühendust.</translation>
 <translation id="8254954272268479918">Linuxi (beetaversioon) väljalülitamine</translation>
 <translation id="8255451560461371599">Taust puudub</translation>
 <translation id="8256319818471787266">Muri</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 3b869c52..d70f385 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -243,7 +243,7 @@
 <translation id="1329584516321524826">Oraintxe eguneratu da</translation>
 <translation id="1330145147221172764">Gaitu pantailako teklatua</translation>
 <translation id="1331977651797684645">Ni izan naiz.</translation>
-<translation id="1333489022424033687">Baliteke <ph name="ORIGIN" /> webguneko eginbide batzuek ez funtzionatzea beste webgune batzuek zure gailuan gorde dituzten datuek garbitu arte</translation>
+<translation id="1333489022424033687">Baliteke <ph name="ORIGIN" /> webguneko eginbide batzuek ez funtzionatzea beste webgune batzuek zure gailuan gorde dituzten datuak garbitu arte</translation>
 <translation id="133535873114485416">Sarrerako metodo hobetsia</translation>
 <translation id="1335929031622236846">Erregistratu gailua</translation>
 <translation id="1338802252451106843"><ph name="ORIGIN" /> webguneak aplikazio hau ireki nahi du.</translation>
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Irudi txikia kendu egin da.</translation>
 <translation id="8252569384384439529">Kargatzen…</translation>
 <translation id="8253198102038551905">Sakatu "+" sarearen propietateak ikusteko</translation>
-<translation id="825483282309623688">Datuak leheneratzeko, Internetera konektatu beharko zara.</translation>
 <translation id="8254954272268479918">Itxi Linux (Beta)</translation>
 <translation id="8255451560461371599">Atzeko planorik gabe</translation>
 <translation id="8256319818471787266">Tximista</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 908f600..b58a506 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">تصویر کوچک حذف شد.</translation>
 <translation id="8252569384384439529">درحال بارگذاری…</translation>
 <translation id="8253198102038551905">روی «+» کلیک کنید تا مشخصات شبکه را دریافت کنید</translation>
-<translation id="825483282309623688">برای بازیابی داده‌هایتان به اتصال اینترنت نیاز دارید.</translation>
 <translation id="8254954272268479918">‏خاموش کردن Linux (بتا)</translation>
 <translation id="8255451560461371599">بدون پس‌زمینه</translation>
 <translation id="8256319818471787266">سرزنده</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 09fe518..2f2572d 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Pikkukuva poistettu.</translation>
 <translation id="8252569384384439529">Ladataan…</translation>
 <translation id="8253198102038551905">Tarkastele verkon ominaisuuksia klikkaamalla +</translation>
-<translation id="825483282309623688">Tietojen palauttamiseen tarvitaan internetyhteys.</translation>
 <translation id="8254954272268479918">Sammuta Linux (beta)</translation>
 <translation id="8255451560461371599">Ei taustaa</translation>
 <translation id="8256319818471787266">Musti</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 69c06a6..2e8879eb 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Naalis ang thumbnail.</translation>
 <translation id="8252569384384439529">Ina-upload...</translation>
 <translation id="8253198102038551905">I-click '+' upang makita ang mga property ng network</translation>
-<translation id="825483282309623688">Upang i-restore ang iyong data, kailangan mo ng koneksyon sa internet.</translation>
 <translation id="8254954272268479918">I-shut down ang Linux (Beta)</translation>
 <translation id="8255451560461371599">Walang background</translation>
 <translation id="8256319818471787266">Bantay</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 38635fe..06cc5889 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Miniature supprimée.</translation>
 <translation id="8252569384384439529">Téléversement en cours…</translation>
 <translation id="8253198102038551905">Cliquez sur « + » pour afficher les propriétés du réseau</translation>
-<translation id="825483282309623688">Pour restaurer vos données, vous devez disposer d'une connexion Internet.</translation>
 <translation id="8254954272268479918">Arrêter Linux (bêta)</translation>
 <translation id="8255451560461371599">Pas d'arrière-plan</translation>
 <translation id="8256319818471787266">Fido</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 3e6870d..a2f8695d 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -2265,7 +2265,7 @@
 <translation id="413121957363593859">Composants</translation>
 <translation id="4131410914670010031">Noir et blanc</translation>
 <translation id="4136203100490971508">L'éclairage nocturne sera désactivé automatiquement au lever du soleil</translation>
-<translation id="41365691917097717">Si vous continuez, le débogage ADB pourra créer et tester des applications Android. Notez que cette action autorise l'installation d'applications Android non validées par Google et ne pourra être désactivée qu'en rétablissant la configuration d'usine.</translation>
+<translation id="41365691917097717">Si vous continuez, le débogage ADB pourra créer et tester des applications Android. Notez que vous autoriserez ainsi l'installation d'applications Android non validées par Google et que le débogage ADB ne pourra être désactivé qu'en rétablissant la configuration d'usine.</translation>
 <translation id="4138267921960073861">Afficher les noms d'utilisateurs et leur photo sur la page de connexion</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - Appareil HID associé</translation>
 <translation id="4142052906269098341">Déverrouillez votre <ph name="DEVICE_TYPE" /> à l'aide de votre téléphone. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">Miniature supprimée</translation>
 <translation id="8252569384384439529">Importation…</translation>
 <translation id="8253198102038551905">Cliquez sur "+" pour accéder aux propriétés réseau.</translation>
-<translation id="825483282309623688">Pour restaurer vos données, vous devez disposer d'une connexion Internet.</translation>
 <translation id="8254954272268479918">Arrêter Linux (bêta)</translation>
 <translation id="8255451560461371599">Sans arrière-plan</translation>
 <translation id="8256319818471787266">Médor</translation>
@@ -5770,7 +5769,7 @@
 <translation id="930268624053534560">Horodatage détaillé</translation>
 <translation id="932327136139879170">Accueil</translation>
 <translation id="932508678520956232">Impossible de lancer l'impression.</translation>
-<translation id="93343527085570547">Accédez à la <ph name="BEGIN_LINK1" />page d'aide relative aux demandes légales<ph name="END_LINK1" /> pour demander des modifications de contenu pour des raisons juridiques. Certaines informations système et relatives au compte peuvent être envoyées à Google. Nous utilisons les données que vous nous fournissez pour résoudre les problèmes techniques et pour améliorer nos services, conformément à nos <ph name="BEGIN_LINK2" />Règles de confidentialité<ph name="END_LINK2" /> et nos <ph name="BEGIN_LINK3" />Conditions d'utilisation<ph name="END_LINK3" />.</translation>
+<translation id="93343527085570547">Accédez à la <ph name="BEGIN_LINK1" />page d'aide concernant les demandes légales<ph name="END_LINK1" /> pour demander des modifications de contenu pour des raisons juridiques. Certaines informations système et relatives au compte peuvent être envoyées à Google. Nous utilisons les données que vous nous fournissez pour résoudre les problèmes techniques et pour améliorer nos services, conformément à nos <ph name="BEGIN_LINK2" />Règles de confidentialité<ph name="END_LINK2" /> et nos <ph name="BEGIN_LINK3" />Conditions d'utilisation<ph name="END_LINK3" />.</translation>
 <translation id="93393615658292258">Mot de passe uniquement</translation>
 <translation id="934503638756687833">Au besoin, les éléments non indiqués ici seront également supprimés. Pour en savoir plus sur la &lt;a href="<ph name="URL" />"&gt;protection contre les logiciels malveillants&lt;/a&gt;, consultez le livre blanc sur les règles de confidentialité de Chrome.</translation>
 <translation id="935490618240037774">Vos favoris, votre historique, vos mots de passe et d'autres paramètres seront synchronisés avec votre compte Google, afin que vous puissiez les utiliser sur tous vos appareils.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 56f06130..42b9f22 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Miniatura eliminada.</translation>
 <translation id="8252569384384439529">Cargando…</translation>
 <translation id="8253198102038551905">Facer clic en "+" para obter as propiedades da rede</translation>
-<translation id="825483282309623688">Para restaurar os teus datos, necesitas unha conexión a Internet.</translation>
 <translation id="8254954272268479918">Pechar Linux (beta)</translation>
 <translation id="8255451560461371599">Sen fondo</translation>
 <translation id="8256319818471787266">Cadelo</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 9abe9ed..02b3397 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -5081,7 +5081,6 @@
 <translation id="8251578425305135684">થંબનેલ દૂર કર્યું.</translation>
 <translation id="8252569384384439529">અપલોડ કરી રહ્યાં છીએ...</translation>
 <translation id="8253198102038551905">નેટવર્ક ગુણધર્મો મેળવવા માટે '+' ક્લિક કરો</translation>
-<translation id="825483282309623688">તમારા ડેટાને પુનઃસ્થાપિત કરવા માટે, તમારે ઇન્ટરનેટ કનેક્શનની જરૂર છે.</translation>
 <translation id="8254954272268479918">Linux (બીટા) બંધ કરો</translation>
 <translation id="8255451560461371599">કોઈ બૅકગ્રાઉન્ડ ટાઇલ નથી</translation>
 <translation id="8256319818471787266">સ્પાર્કી</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index ceaee193c..88d38db7 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">थंबनेल निकाला गया.</translation>
 <translation id="8252569384384439529">अपलोड हो रही है...</translation>
 <translation id="8253198102038551905">नेटवर्क प्रॉपर्टी पाने के लिए '+' बटन पर क्‍लिक करें</translation>
-<translation id="825483282309623688">अपना डेटा फिर से स्थापित करने के लिए, आपको इंटरनेट कनेक्शन की आवश्यकता होगी.</translation>
 <translation id="8254954272268479918">Linux (बीटा) बंद करें</translation>
 <translation id="8255451560461371599">कोई बैकग्राउंड नहीं</translation>
 <translation id="8256319818471787266">स्‍पार्की</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 3cf4f1b..cc339b8 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Sličica je uklonjena.</translation>
 <translation id="8252569384384439529">Prijenos...</translation>
 <translation id="8253198102038551905">Kliknite "+" za proširenje svojstava mreže</translation>
-<translation id="825483282309623688">Za vraćanje podataka potrebna vam je internetska veza.</translation>
 <translation id="8254954272268479918">Isključi Linux (Beta)</translation>
 <translation id="8255451560461371599">Bez pozadine</translation>
 <translation id="8256319818471787266">Bobi</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index e5ddc12..275d0e7 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -243,7 +243,7 @@
 <translation id="1329584516321524826">Most frissítve</translation>
 <translation id="1330145147221172764">Képernyő-billentyűzet engedélyezése</translation>
 <translation id="1331977651797684645">Én voltam.</translation>
-<translation id="1333489022424033687">Lehetséges, hogy néhány funkció nem működik a(z) <ph name="ORIGIN" /> címen, amíg nem törli a más webhelyek által az Ön eszközén tárolt adatokat.</translation>
+<translation id="1333489022424033687">Lehetséges, hogy néhány funkció nem működik a(z) <ph name="ORIGIN" /> helyen, amíg nem törli a más webhelyek által az Ön eszközén tárolt adatokat.</translation>
 <translation id="133535873114485416">Elsődleges bevitel</translation>
 <translation id="1335929031622236846">Az eszköz regisztrálása</translation>
 <translation id="1338802252451106843">A(z) <ph name="ORIGIN" /> meg akarja nyitni ezt az alkalmazást.</translation>
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">Indexkép eltávolítva.</translation>
 <translation id="8252569384384439529">Feltöltés…</translation>
 <translation id="8253198102038551905">Kattintson a „+” gombra a hálózati tulajdonságok lekéréséhez.</translation>
-<translation id="825483282309623688">Adatai visszaállításához internetkapcsolat szükséges.</translation>
 <translation id="8254954272268479918">Linux (béta) kikapcsolása</translation>
 <translation id="8255451560461371599">Nincs háttér</translation>
 <translation id="8256319818471787266">Bundi</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 9b12c72a..a3305fa1 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -5091,7 +5091,6 @@
 <translation id="8251578425305135684">Մանրապատկերը հեռացվել է:</translation>
 <translation id="8252569384384439529">Վերբեռնում...</translation>
 <translation id="8253198102038551905">Ցանցի հատկությունները տեսնելու համար սեղմեք «+»</translation>
-<translation id="825483282309623688">Ձեր տվյալները վերականգնելու համար ինտերնետ կապ է հարկավոր:</translation>
 <translation id="8254954272268479918">Անջատել Լինուքսը (բետա)</translation>
 <translation id="8255451560461371599">Առանց ֆոնի</translation>
 <translation id="8256319818471787266">Ռեքս</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index d329792d..198bc791 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Gambar kecil dihapus.</translation>
 <translation id="8252569384384439529">Mengupload...</translation>
 <translation id="8253198102038551905">Klik '+' untuk mendapatkan properti jaringan</translation>
-<translation id="825483282309623688">Untuk memulihkan data, Anda perlu sambungan Internet.</translation>
 <translation id="8254954272268479918">Matikan Linux (Beta)</translation>
 <translation id="8255451560461371599">Tidak ada latar belakang</translation>
 <translation id="8256319818471787266">Bleki</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index f8f82890..a197d65 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Smámynd fjarlægð.</translation>
 <translation id="8252569384384439529">Hleður inn...</translation>
 <translation id="8253198102038551905">Smelltu á „+“ til að fá upp neteiginleika</translation>
-<translation id="825483282309623688">Nettengingar er krafist til að endurheimta gögn.</translation>
 <translation id="8254954272268479918">Slökkva á Linux (tilraunaútgáfa)</translation>
 <translation id="8255451560461371599">Enginn bakgrunnur</translation>
 <translation id="8256319818471787266">Lúkas</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index e04221dd..9502e597 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Miniatura rimossa.</translation>
 <translation id="8252569384384439529">Caricamento...</translation>
 <translation id="8253198102038551905">Fai clic su "+" per visualizzare le proprietà della rete</translation>
-<translation id="825483282309623688">Per ripristinare i dati devi avere una connessione Internet.</translation>
 <translation id="8254954272268479918">Spegni Linux (beta)</translation>
 <translation id="8255451560461371599">Nessuno sfondo</translation>
 <translation id="8256319818471787266">Fido</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 0594126f..897d01e 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">התמונה הממוזערת הוסרה.</translation>
 <translation id="8252569384384439529">מעלה...</translation>
 <translation id="8253198102038551905">לחץ על '+' כדי לקבל מאפייני רשת</translation>
-<translation id="825483282309623688">יש צורך בחיבור לאינטרנט כדי לשחזר את הנתונים.</translation>
 <translation id="8254954272268479918">‏כיבוי של Linux (בטא)</translation>
 <translation id="8255451560461371599">ללא רקע</translation>
 <translation id="8256319818471787266">נבחן</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 623decf..a1fbc7d 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">サムネイルを削除しました。</translation>
 <translation id="8252569384384439529">アップロードしています...</translation>
 <translation id="8253198102038551905">ネットワークのプロパティを表示するには [+] をクリック</translation>
-<translation id="825483282309623688">データを復元するにはインターネット接続が必要です。</translation>
 <translation id="8254954272268479918">Linux(ベータ版)を終了</translation>
 <translation id="8255451560461371599">背景なし</translation>
 <translation id="8256319818471787266">スパーキー</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 368b53fee..428bcb9 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">ესკიზები წაშლილია.</translation>
 <translation id="8252569384384439529">მიმდინარეობს ატვირთვა...</translation>
 <translation id="8253198102038551905">ქსელის თვისებების მიღებისათვის, დააჭირეთ „+“</translation>
-<translation id="825483282309623688">თქვენი მონაცემების აღსადგენად საჭიროა ინტერნეტთან კავშირი.</translation>
 <translation id="8254954272268479918">Linux-ის (ბეტა) გამორთვა</translation>
 <translation id="8255451560461371599">ფონის გარეშე</translation>
 <translation id="8256319818471787266">სპარკი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 063700f..086b543 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -5085,7 +5085,6 @@
 <translation id="8251578425305135684">Нобай жойылды.</translation>
 <translation id="8252569384384439529">Жүктеп салынуда…</translation>
 <translation id="8253198102038551905">Желілік сипаттарын алу үшін "+" белгісін басыңыз</translation>
-<translation id="825483282309623688">Деректерді қалпына келтіру үшін интернет байланысы қажет.</translation>
 <translation id="8254954272268479918">Linux (бета нұсқасы) виртуалды құрылғысын жабу</translation>
 <translation id="8255451560461371599">Фонсыз</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 81894ad..573d8938 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">រូបតំណាងតូចត្រូវបានដកចេញ។</translation>
 <translation id="8252569384384439529">កំពុង​បង្ហោះ...</translation>
 <translation id="8253198102038551905">ចុច '+' ដើម្បីទទួលយកលក្ខណៈសម្បត្តិបណ្តាញ</translation>
-<translation id="825483282309623688">ដើម្បីស្តារទិន្នន័យរបស់អ្នកឡើងវិញ អ្នកត្រូវមានការតភ្ជាប់អ៊ីនធឺណិត។</translation>
 <translation id="8254954272268479918">បិទ Linux (បេតា)</translation>
 <translation id="8255451560461371599">គ្មាន​ផ្ទៃខាងក្រោយ</translation>
 <translation id="8256319818471787266">ស្ពាកគី</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index c1740a04..17d60641 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">ಥಂಬ್‌ನೇಲ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ.</translation>
 <translation id="8252569384384439529">ಅಪ್‌ಲೋಡ್‌ ಆಗುತ್ತಿದೆ...</translation>
 <translation id="8253198102038551905">ನೆಟ್‌ವರ್ಕ್ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪಡೆಯಲು '+' ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
-<translation id="825483282309623688">ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಮರುಸ್ಥಾಪಿಸಲು, ನಿಮಗೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಅಗತ್ಯವಿದೆ.</translation>
 <translation id="8254954272268479918">Linux (ಬೀಟಾ) ಸ್ಥಗಿತಗೊಳಿಸಿ</translation>
 <translation id="8255451560461371599">ಯಾವುದೇ ಹಿನ್ನೆಲೆಯಿಲ್ಲ</translation>
 <translation id="8256319818471787266">ಸ್ಪಾರ್ಕಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 6c9b996..78993b5 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">미리보기 이미지가 삭제되었습니다.</translation>
 <translation id="8252569384384439529">업로드 중...</translation>
 <translation id="8253198102038551905">'+'를 클릭하여 네트워크 속성 보기</translation>
-<translation id="825483282309623688">데이터를 복원하려면 인터넷 연결이 필요합니다.</translation>
 <translation id="8254954272268479918">Linux(베타) 종료</translation>
 <translation id="8255451560461371599">배경 없음</translation>
 <translation id="8256319818471787266">멍멍이</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index f713336a..f985739 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Бармакбасым алынып салынды.</translation>
 <translation id="8252569384384439529">Жүктөлүп берилүүдө…</translation>
 <translation id="8253198102038551905">Тармак касиеттерин ачуу үчүн "+" дегенди чыкылдатыңыз</translation>
-<translation id="825483282309623688">Дайындарыңызды калыбына келтирүү үчүн Интернет байланышы керек.</translation>
 <translation id="8254954272268479918">Linux'ту (бета-версиясы) жабуу</translation>
 <translation id="8255451560461371599">Эч кандай фон жок</translation>
 <translation id="8256319818471787266">Балтек</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 2e639b34..ec7b55b 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -5085,7 +5085,6 @@
 <translation id="8251578425305135684">ເອົາຮູບນ້ອຍອອກໄປແລ້ວ.</translation>
 <translation id="8252569384384439529">ກຳລັງອັບໂຫລດ...</translation>
 <translation id="8253198102038551905">ຄ​ລິກ '+' ເພື່ອ​ເອົາ​ຄຸນ​ສົມ​ບັດ​ເຄືອ​ຂ່າຍ</translation>
-<translation id="825483282309623688">ເພື່ອກູ້ຄືນຂໍ້ມູນຂອງທ່ານ, ທ່ານຈຳເປັນຕ້ອງມີການເຊື່ອຕໍ່ອິນເຕີເນັດ.</translation>
 <translation id="8254954272268479918">ປິດເຄື່ອງ Linux (ເບຕ້າ)</translation>
 <translation id="8255451560461371599">ບໍ່ມີພາບພື້ນຫຼັງ</translation>
 <translation id="8256319818471787266">ມີປະກາຍໄຟ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index da47551..5838069 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">Miniatiūra pašalinta.</translation>
 <translation id="8252569384384439529">Įkeliama...</translation>
 <translation id="8253198102038551905">Spustelėkite „+“, kad peržiūrėtumėte tinklo savybes</translation>
-<translation id="825483282309623688">Norint atkurti duomenis, reikės interneto ryšio.</translation>
 <translation id="8254954272268479918">Išjungti „Linux“ (beta)</translation>
 <translation id="8255451560461371599">Be fono</translation>
 <translation id="8256319818471787266">Žaismingasis</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 84724fa..b389979 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Sīktēls ir noņemts.</translation>
 <translation id="8252569384384439529">Notiek augšupielāde...</translation>
 <translation id="8253198102038551905">Noklikšķiniet uz “+”, lai iegūtu tīkla rekvizītus</translation>
-<translation id="825483282309623688">Lai atjaunotu datus, ir nepieciešams interneta savienojums.</translation>
 <translation id="8254954272268479918">Izslēgt Linux (Beta)</translation>
 <translation id="8255451560461371599">Bez fona</translation>
 <translation id="8256319818471787266">Džeris</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 02128c77..3ee9460 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Отстранета сликичка.</translation>
 <translation id="8252569384384439529">Се прикачува…</translation>
 <translation id="8253198102038551905">Кликнете на „+" за да ги добиете својствата на мрежата</translation>
-<translation id="825483282309623688">За да ги вратите податоците, ви треба интернет-врска.</translation>
 <translation id="8254954272268479918">Исклучи Linux (Бета)</translation>
 <translation id="8255451560461371599">Без заднина</translation>
 <translation id="8256319818471787266">Џеки</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 8479ef5a..dc86bde3 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">ലഘുചിത്രം നീക്കംചെയ്‌തു.</translation>
 <translation id="8252569384384439529">അപ്‌ലോഡ് ചെയ്യുന്നു...</translation>
 <translation id="8253198102038551905">നെറ്റ്‌വർക്ക് പ്രോപ്പർട്ടികൾ ലഭിക്കാൻ '+' ക്ലിക്ക് ചെയ്യുക</translation>
-<translation id="825483282309623688">നിങ്ങളുടെ ഡാറ്റ പുനഃസ്ഥാപിക്കാൻ, ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്.</translation>
 <translation id="8254954272268479918">Linux (ബീറ്റ) ഷട്ട് ഡൗൺ ചെയ്യുക</translation>
 <translation id="8255451560461371599">പശ്ചാത്തലം ഇല്ലാത്തത്</translation>
 <translation id="8256319818471787266">സ്‌പാർക്കി</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index acdc10a..cb96e31d 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -5079,7 +5079,6 @@
 <translation id="8251578425305135684">Жижиг зураг устгагдсан.</translation>
 <translation id="8252569384384439529">Байршуулж байна...</translation>
 <translation id="8253198102038551905">Сүлжээний хандалтын сонголтыг нэмэгдүүлэхийн тулд  '+' дээр дарна уу</translation>
-<translation id="825483282309623688">Өгөгдлөө сэргээхийн тулд интернэтэд холбогдоно уу.</translation>
 <translation id="8254954272268479918">Linux (Бэта)-г унтраах</translation>
 <translation id="8255451560461371599">Арын дэвсгэр байхгүй</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 10c4bb1..3f44373 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -5085,7 +5085,6 @@
 <translation id="8251578425305135684">थंबनेल काढली.</translation>
 <translation id="8252569384384439529">अपलोड करत आहे…</translation>
 <translation id="8253198102038551905">नेटवर्क गुणधर्म मिळविण्यासाठी '+' क्लिक करा</translation>
-<translation id="825483282309623688">तुमचा डेटा पुनर्संचयित करण्यासाठी, तुम्हाला इंटरनेट कनेक्शनची आवश्यकता आहे.</translation>
 <translation id="8254954272268479918">Linux (बीटा) बंद करा</translation>
 <translation id="8255451560461371599">कोणतीही बॅकग्राउंड नाही</translation>
 <translation id="8256319818471787266">चमचमते</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index c93dcca..c372221 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Lakaran kenit dibuang.</translation>
 <translation id="8252569384384439529">Memuat naik...</translation>
 <translation id="8253198102038551905">Klik '+' untuk mendapatkan sifat rangkaian</translation>
-<translation id="825483282309623688">Untuk memulihkan data, anda memerlukan sambungan Internet.</translation>
 <translation id="8254954272268479918">Matikan Linux (Beta)</translation>
 <translation id="8255451560461371599">Tiada latar belakang</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 68f11a5..1f8fea4c 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -243,7 +243,7 @@
 <translation id="1329584516321524826">ယခုလေးတင် အပ်ဒိတ်လုပ်ထားသည်</translation>
 <translation id="1330145147221172764">မျက်နှာပြင် ကီးဘုတ်ကို ပြရန်</translation>
 <translation id="1331977651797684645">၎င်းသည် ကျွန်ုပ်ဖြစ်ပါသည်။</translation>
-<translation id="1333489022424033687">သင့်စက်ပေါ်တွင် အခြားဝဘ်ဆိုက်များက သိမ်းဆည်းထားသည့် ဒေတာများကို မဖျက်မချင်း <ph name="ORIGIN" /> ရှိ ဝန်ဆောင်မှုအချို့ကို အသုံးပြုနိုမည် မဟုတ်ပါ</translation>
+<translation id="1333489022424033687">သင့်စက်ပေါ်တွင် အခြားဝဘ်ဆိုက်များက သိမ်းဆည်းထားသည့် ဒေတာများကို မဖျက်မချင်း <ph name="ORIGIN" /> ရှိ ဝန်ဆောင်မှုအချို့ကို အသုံးပြုနိုင်မည် မဟုတ်ပါ</translation>
 <translation id="133535873114485416">ဦးစားပေး စာရိုက်စနစ်</translation>
 <translation id="1335929031622236846">သင့်စက်ကို စာရင်းသွင်းခြင်း</translation>
 <translation id="1338802252451106843"><ph name="ORIGIN" /> က ဤအပလီကေးရှင်းကို ဖွင့်လိုသည်။</translation>
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">လက်သည်းပုံ ဖယ်ရှားလိုက်ပါပြီ။</translation>
 <translation id="8252569384384439529">အပ်လုဒ်လုပ်နေသည်...</translation>
 <translation id="8253198102038551905">'+' ကို နှိပ်ပြီး ကွန်ယက်ဂုဏ်သတ္တိများကိို ရယူပါ</translation>
-<translation id="825483282309623688">သင့်ဒေတာများကို ပြန်ယူရန် အင်တာနက်ချိတ်ဆက်မှု လိုအပ်ပါသည်။</translation>
 <translation id="8254954272268479918">Linux (စမ်းသပ်ဆော့ဖ်ဝဲ) ကို ပိတ်ရန်</translation>
 <translation id="8255451560461371599">နောက်ခံ မရှိပါ</translation>
 <translation id="8256319818471787266">စပါကီ</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 2fd049b1..0324905 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -5083,7 +5083,6 @@
 <translation id="8251578425305135684">थम्बनेल हटाइयो।</translation>
 <translation id="8252569384384439529">अपलोड गर्दै...</translation>
 <translation id="8253198102038551905">नेटवर्क गुणहरू प्राप्त गर्न '+' क्लिक गर्नुहोस्</translation>
-<translation id="825483282309623688">आफ्नो डेटालाई पुनर्स्थापना गर्न तपाईँसँग इन्टरनेटको जडान हुनु पर्छ।</translation>
 <translation id="8254954272268479918">Linux बन्द गर्नुहोस् (बिटा)</translation>
 <translation id="8255451560461371599">कुनै पनि पृष्ठभूमि छैन</translation>
 <translation id="8256319818471787266">स्पार्की</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 13edc2d..a0cbee6 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Miniatuur verwijderd.</translation>
 <translation id="8252569384384439529">Uploaden...</translation>
 <translation id="8253198102038551905">Kik op '+' om netwerkeigenschappen op te halen</translation>
-<translation id="825483282309623688">Je hebt een internetverbinding nodig om je gegevens terug te zetten.</translation>
 <translation id="8254954272268479918">Linux afsluiten (bèta)</translation>
 <translation id="8255451560461371599">Geen achtergrond</translation>
 <translation id="8256319818471787266">Bello</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 07103ab..746d1479 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -240,7 +240,7 @@
 <translation id="1329584516321524826">Nettopp oppdatert</translation>
 <translation id="1330145147221172764">Slå på skjermtastaturet</translation>
 <translation id="1331977651797684645">Dette var meg.</translation>
-<translation id="1333489022424033687">Noen funksjoner på <ph name="ORIGIN" /> fungerer kanskje ikke før du sletter data som andre enheter har lagret på enheten</translation>
+<translation id="1333489022424033687">Noen funksjoner på <ph name="ORIGIN" /> fungerer kanskje ikke før du sletter data som andre nettsteder har lagret på enheten</translation>
 <translation id="133535873114485416">Foretrukket inndatametode</translation>
 <translation id="1335929031622236846">Registrer enheten din</translation>
 <translation id="1338802252451106843"><ph name="ORIGIN" /> vil åpne denne appen.</translation>
@@ -4094,7 +4094,7 @@
 <translation id="6892812721183419409">Åpne linken som <ph name="USER" /></translation>
 <translation id="6895032998810961280">Rapportér detaljer til Google om skadelige programmer, systeminnstillinger og prosesser som ble funnet på datamaskinen din i denne opprydningen.</translation>
 <translation id="6896758677409633944">Kopiér</translation>
-<translation id="6897363604023044284">Velg nettsteder som skal slettes</translation>
+<translation id="6897363604023044284">Velg nettsteder å slette data fra</translation>
 <translation id="6898440773573063262">Nå kan kioskapper konfigureres til å starte automatisk på denne enheten.</translation>
 <translation id="6898699227549475383">Organisasjon (O)</translation>
 <translation id="6900284862687837908">Bakgrunnsapp: <ph name="BACKGROUND_APP_URL" /></translation>
@@ -5073,7 +5073,6 @@
 <translation id="8251578425305135684">Miniatyrbilde fjernet.</translation>
 <translation id="8252569384384439529">Laster opp …</translation>
 <translation id="8253198102038551905">Klikk på «+» for å gå til nettverksegenskaper</translation>
-<translation id="825483282309623688">Du må være koblet til Internett for å kunne gjenopprette dataene dine.</translation>
 <translation id="8254954272268479918">Slå av Linux (beta)</translation>
 <translation id="8255451560461371599">Ingen bakgrunn</translation>
 <translation id="8256319818471787266">Fido</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 68c3d34..d3f89cb 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -5081,7 +5081,6 @@
 <translation id="8251578425305135684">ଥମ୍ବନେଲ୍ କାଢ଼ି ଦିଆଯାଇଛି।</translation>
 <translation id="8252569384384439529">ଅପ୍‌ଲୋଡ୍ ହେଉଛି...</translation>
 <translation id="8253198102038551905">ନେଟୱର୍କ ପ୍ରପର୍ଟିସ୍ ପାଇବା ପାଇଁ '+' କ୍ଲିକ୍ କରନ୍ତୁ</translation>
-<translation id="825483282309623688">ଆପଣଙ୍କର ଡାଟା ପୁନଃସ୍ଥାପନ କରିବାକୁ ଆପଣଙ୍କୁ ଏକ ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଆବଶ୍ୟକ ଅଟେ।</translation>
 <translation id="8254954272268479918">Linux (ବିଟା) ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="8255451560461371599">କୌଣସି ପୃଷ୍ଠପଟ ନାହିଁ</translation>
 <translation id="8256319818471787266">ସ୍ପାର୍କୀ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index de3b6340..e1d99b1 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -5084,7 +5084,6 @@
 <translation id="8251578425305135684">ਲਘੂ-ਚਿੱਤਰ ਹਟਾਇਆ ਗਿਆ।</translation>
 <translation id="8252569384384439529">ਅੱਪਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...</translation>
 <translation id="8253198102038551905">ਨੈੱਟਵਰਕ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ '+' 'ਤੇ ਕਲਿੱਕ ਕਰੋ</translation>
-<translation id="825483282309623688">ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਇੱਕ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਦੀ ਲੋੜ ਹੈ।</translation>
 <translation id="8254954272268479918">Linux (ਬੀਟਾ) ਨੂੰ ਬੰਦ ਕਰੋ</translation>
 <translation id="8255451560461371599">ਕੋਈ ਬੈਕਗ੍ਰਾਊਂਡ ਨਹੀਂ</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 952ec650..0a91f179 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Usunięto miniaturę.</translation>
 <translation id="8252569384384439529">Przesyłam…</translation>
 <translation id="8253198102038551905">Kliknij „+”, by zobaczyć właściwości sieci</translation>
-<translation id="825483282309623688">Aby przywrócić dane, musisz mieć połączenie z internetem.</translation>
 <translation id="8254954272268479918">Wyłącz Linuksa (Beta)</translation>
 <translation id="8255451560461371599">Bez tła</translation>
 <translation id="8256319818471787266">Tofik</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index dfb24c64..f78c984 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -5091,7 +5091,6 @@
 <translation id="8251578425305135684">Miniatura removida.</translation>
 <translation id="8252569384384439529">Fazendo upload…</translation>
 <translation id="8253198102038551905">Clique em "+" para ver as propriedades da rede</translation>
-<translation id="825483282309623688">Para restaurar seus dados, é necessário ter uma conexão com a Internet.</translation>
 <translation id="8254954272268479918">Desligar o Linux (Beta)</translation>
 <translation id="8255451560461371599">Sem plano de fundo</translation>
 <translation id="8256319818471787266">Totó</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 319c79f..c8db555 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Miniatura removida.</translation>
 <translation id="8252569384384439529">A carregar…</translation>
 <translation id="8253198102038551905">Clique em "+" para aceder às propriedades de rede</translation>
-<translation id="825483282309623688">Para restaurar os dados, precisa de uma ligação à Internet.</translation>
 <translation id="8254954272268479918">Encerrar o Linux (Beta)</translation>
 <translation id="8255451560461371599">Sem fundo</translation>
 <translation id="8256319818471787266">Pantufa</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 07955b5..322c541 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Miniatura a fost eliminată.</translation>
 <translation id="8252569384384439529">Se încarcă...</translation>
 <translation id="8253198102038551905">Pentru a vedea proprietățile rețelei, dă clic pe „+”</translation>
-<translation id="825483282309623688">Pentru a restabili datele ai nevoie de o conexiune la internet.</translation>
 <translation id="8254954272268479918">Închide Linux (Beta)</translation>
 <translation id="8255451560461371599">Nicio imagine de fundal</translation>
 <translation id="8256319818471787266">Lăbuș</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 4035c86..80498f7 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">Быстрая ссылка удалена.</translation>
 <translation id="8252569384384439529">Загрузка...</translation>
 <translation id="8253198102038551905">Чтобы просмотреть свойства сети, нажмите "+"</translation>
-<translation id="825483282309623688">Чтобы восстановить данные, необходимо подключение к Интернету.</translation>
 <translation id="8254954272268479918">Завершить работу Linux (бета)</translation>
 <translation id="8255451560461371599">Без фона</translation>
 <translation id="8256319818471787266">Дружок</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 9ccef00..dcf9d828 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -5084,7 +5084,6 @@
 <translation id="8251578425305135684">තම්බ්නේල් ඉවත් කරන ලදි.</translation>
 <translation id="8252569384384439529">උඩුගත කරමින්...</translation>
 <translation id="8253198102038551905">ජාල වත්කම් ලැබීමට '+' ක්ලික් කරන්න</translation>
-<translation id="825483282309623688">ඔබේ දත්ත ප්‍රතිසාධනය කිරීමට, ඔබට අන්තර්ජාල සබැඳුමක් අවශ්‍යය.</translation>
 <translation id="8254954272268479918">ලිනක්ස් වසා දමන්න (බීටා)</translation>
 <translation id="8255451560461371599">පසුබිමක් නැත</translation>
 <translation id="8256319818471787266">ප්‍රාණවත්බවින් යුත්</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index f81b42d..6310116fe 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Miniatúra odstránená.</translation>
 <translation id="8252569384384439529">Nahráva sa...</translation>
 <translation id="8253198102038551905">Vlastnosti siete otvoríte kliknutím na tlačidlo plus (+)</translation>
-<translation id="825483282309623688">Obnovenie údajov vyžaduje pripojenie k internetu.</translation>
 <translation id="8254954272268479918">Vypnúť Linux (beta)</translation>
 <translation id="8255451560461371599">Žiadne pozadie</translation>
 <translation id="8256319818471787266">Rexo</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index f719b1ea..5bdc4c4d 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -5091,7 +5091,6 @@
 <translation id="8251578425305135684">Sličica je odstranjena.</translation>
 <translation id="8252569384384439529">Nalaganje …</translation>
 <translation id="8253198102038551905">Kliknite »+«, če želite prikazati omrežne nastavitve</translation>
-<translation id="825483282309623688">Če želite obnoviti podatke, potrebujete internetno povezavo.</translation>
 <translation id="8254954272268479918">Izklopi Linux (beta)</translation>
 <translation id="8255451560461371599">Brez ozadja</translation>
 <translation id="8256319818471787266">Piki</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 6f6b7d8b..6420617 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -5084,7 +5084,6 @@
 <translation id="8251578425305135684">Miniatura u hoq.</translation>
 <translation id="8252569384384439529">Po ngarkohet...</translation>
 <translation id="8253198102038551905">Kliko "+" për të gjetur karakteristikat e rrjetit</translation>
-<translation id="825483282309623688">Për të restauruar të dhënat e tua, të duhet një lidhje interneti.</translation>
 <translation id="8254954272268479918">Fike sistemin Linux (Beta)</translation>
 <translation id="8255451560461371599">Pa sfond</translation>
 <translation id="8256319818471787266">Xixëllues</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index acd7263..7de22d2 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -5087,7 +5087,6 @@
 <translation id="8251578425305135684">Сличица је уклоњена.</translation>
 <translation id="8252569384384439529">Отпрема се...</translation>
 <translation id="8253198102038551905">Кликните на „+“ да бисте видели својства мреже</translation>
-<translation id="825483282309623688">Да бисте копирали податке назад, потребна вам је интернет веза.</translation>
 <translation id="8254954272268479918">Искључи Linux (бета)</translation>
 <translation id="8255451560461371599">Нема позадине</translation>
 <translation id="8256319818471787266">Искрица</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 5c2e041e..ed955939 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Miniatyren har tagits bort.</translation>
 <translation id="8252569384384439529">Laddar upp …</translation>
 <translation id="8253198102038551905">Klicka på + för att hämta nätverksegenskaperna</translation>
-<translation id="825483282309623688">Du behöver en internetanslutning för att kunna återställa data.</translation>
 <translation id="8254954272268479918">Avsluta Linux (beta)</translation>
 <translation id="8255451560461371599">Ingen bakgrund</translation>
 <translation id="8256319818471787266">Ludde</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 82b6832..bb40e41 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">Kijipicha kimeondolewa.</translation>
 <translation id="8252569384384439529">Inapakia...</translation>
 <translation id="8253198102038551905">Bonyeza '+' ili kupata sifa za mtandao</translation>
-<translation id="825483282309623688">Ili kurejesha data yako, unahitaji kuwa na muunganisho wa Intaneti.</translation>
 <translation id="8254954272268479918">Zima Linux (Beta)</translation>
 <translation id="8255451560461371599">Hakuna mandhari nyuma</translation>
 <translation id="8256319818471787266">Spaki</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 94def3e..bb230263 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">சிறு படம் நீக்கப்பட்டது.</translation>
 <translation id="8252569384384439529">பதிவேற்றுகிறது...</translation>
 <translation id="8253198102038551905">நெட்வொர்க் பண்புகளைப் பெற '+'ஐக் கிளிக் செய்யவும்</translation>
-<translation id="825483282309623688">தரவை மீட்டமைக்க, இணையத்துடன் இணைக்கவும்.</translation>
 <translation id="8254954272268479918">Linuxஸை (பீட்டா) நிறுத்து</translation>
 <translation id="8255451560461371599">பின்புலம் இல்லை</translation>
 <translation id="8256319818471787266">ஸ்பார்க்கி</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index f8ce6774..53275394 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -5084,7 +5084,6 @@
 <translation id="8251578425305135684">సూక్ష్మచిత్రం తొలగించబడింది.</translation>
 <translation id="8252569384384439529">అప్‌లోడ్ చేస్తోంది...</translation>
 <translation id="8253198102038551905">నెట్‌వర్క్ లక్షణాలను పొందడానికి '+' క్లిక్ చేయండి</translation>
-<translation id="825483282309623688">మీ డేటాను పునరుద్ధరించడానికి, ఇంటర్నెట్ కనెక్షన్ ఉండాలి.</translation>
 <translation id="8254954272268479918">Linux (బీటా)ను షట్ డౌన్ చేయండి</translation>
 <translation id="8255451560461371599">నేపథ్య చిత్రం ఏదీ వద్దు</translation>
 <translation id="8256319818471787266">స్పార్కీ</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 2bd01d1..256b019f 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">รูปภาพขนาดย่อถูกลบแล้ว</translation>
 <translation id="8252569384384439529">กำลังอัปโหลด...</translation>
 <translation id="8253198102038551905">คลิก "+" เพื่อดูคุณสมบัติของเครือข่าย</translation>
-<translation id="825483282309623688">คุณต้องเชื่อมต่ออินเทอร์เน็ตเพื่อเรียกคืนข้อมูล</translation>
 <translation id="8254954272268479918">ปิด Linux (เบต้า)</translation>
 <translation id="8255451560461371599">ไม่มีพื้นหลัง</translation>
 <translation id="8256319818471787266">สปาร์กกี้</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index a711637..2ce4c71 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Küçük resim kaldırıldı.</translation>
 <translation id="8252569384384439529">Yükleniyor...</translation>
 <translation id="8253198102038551905">Ağ özelliklerini almak için "+" işaretini tıklayın</translation>
-<translation id="825483282309623688">Verilerinizi geri yüklemek için İnternet bağlantınızın olması gerekir.</translation>
 <translation id="8254954272268479918">Linux'u (Beta) kapat</translation>
 <translation id="8255451560461371599">Arka plan yok</translation>
 <translation id="8256319818471787266">Çomar</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index ad4b2dde..bdb48ac 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Ескіз видалено.</translation>
 <translation id="8252569384384439529">Завантаження…</translation>
 <translation id="8253198102038551905">Натисніть "+", щоб відобразити властивості мережі</translation>
-<translation id="825483282309623688">Щоб відновити дані, потрібне з’єднання з Інтернетом.</translation>
 <translation id="8254954272268479918">Вимкнути Linux (бета-версія)</translation>
 <translation id="8255451560461371599">Без фону</translation>
 <translation id="8256319818471787266">Шибеник</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 395287b..a31c709 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -5090,7 +5090,6 @@
 <translation id="8251578425305135684">تھمب نیل کو ہٹا دیا گیا۔</translation>
 <translation id="8252569384384439529">اپ لوڈ ہو رہی ہے...</translation>
 <translation id="8253198102038551905">نیٹ ورک کی خصوصیات حاصل کرنے کیلئے '+' پر کلک کریں</translation>
-<translation id="825483282309623688">اپنا ڈیٹا بحال کرنے کیلئے، آپ کو ایک انٹرنیٹ کنکشن کی ضرورت ہے۔</translation>
 <translation id="8254954272268479918">‏Linux (بی ٹا) بند کریں</translation>
 <translation id="8255451560461371599">کوئی پس منظر نہیں</translation>
 <translation id="8256319818471787266">Sparky</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 1bbf29b9..b373836 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -5085,7 +5085,6 @@
 <translation id="8251578425305135684">Tezkor havola o‘chirildi.</translation>
 <translation id="8252569384384439529">Yuklanmoqda…</translation>
 <translation id="8253198102038551905">Tarmoq xususiyatlarini ko‘rish uchun “+” ustiga bosing</translation>
-<translation id="825483282309623688">Ma’lumotlarni qayta tiklash uchun Internetga ulanish zarur.</translation>
 <translation id="8254954272268479918">Linux (Beta) ishini yakunlash</translation>
 <translation id="8255451560461371599">Orqa fonsiz</translation>
 <translation id="8256319818471787266">Olapar</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 3940d62..737f5c71 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -5089,7 +5089,6 @@
 <translation id="8251578425305135684">Đã xóa hình thu nhỏ.</translation>
 <translation id="8252569384384439529">Đang tải lên...</translation>
 <translation id="8253198102038551905">Hãy nhấp vào '+' để nhận thuộc tính mạng</translation>
-<translation id="825483282309623688">Để khôi phục dữ liệu, bạn cần có kết nối Internet.</translation>
 <translation id="8254954272268479918">Tắt Linux (Thử nghiệm)</translation>
 <translation id="8255451560461371599">Không có hình nền</translation>
 <translation id="8256319818471787266">Cún con tinh nghịch</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 68f13539..cfe65c7 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -5083,7 +5083,6 @@
 <translation id="8251578425305135684">已删除缩略图。</translation>
 <translation id="8252569384384439529">正在上传…</translation>
 <translation id="8253198102038551905">点击“+”可查看网络属性</translation>
-<translation id="825483282309623688">要恢复数据,您需要连接互联网。</translation>
 <translation id="8254954272268479918">关闭 Linux 虚拟机(测试版)</translation>
 <translation id="8255451560461371599">无背景图片</translation>
 <translation id="8256319818471787266">狗狗</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index aa710773..1edfd02 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">已移除縮圖。</translation>
 <translation id="8252569384384439529">正在上載…</translation>
 <translation id="8253198102038551905">按一下 [+] 以取得網絡屬性</translation>
-<translation id="825483282309623688">您需要連接至互聯網,才能還原資料。</translation>
 <translation id="8254954272268479918">關閉 Linux (Beta 版本)</translation>
 <translation id="8255451560461371599">無背景圖片</translation>
 <translation id="8256319818471787266">小黃</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index b007211..80cc424 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -243,7 +243,7 @@
 <translation id="1329584516321524826">剛才更新</translation>
 <translation id="1330145147221172764">啟用螢幕小鍵盤</translation>
 <translation id="1331977651797684645">這是我。</translation>
-<translation id="1333489022424033687">在你清除裝置上其他網站所儲存的資料之前,部分 <ph name="ORIGIN" /> 上的功能可能無法正常運作</translation>
+<translation id="1333489022424033687">在你清除裝置上其他網站所儲存的資料之前,<ph name="ORIGIN" /> 上的部分功能可能無法正常運作</translation>
 <translation id="133535873114485416">偏好的輸入來源</translation>
 <translation id="1335929031622236846">註冊你的裝置</translation>
 <translation id="1338802252451106843"><ph name="ORIGIN" /> 想要開啟這個應用程式。</translation>
@@ -5086,7 +5086,6 @@
 <translation id="8251578425305135684">已移除縮圖。</translation>
 <translation id="8252569384384439529">上傳中...</translation>
 <translation id="8253198102038551905">按一下 [+] 即可查看網路屬性</translation>
-<translation id="825483282309623688">您必須連上網際網路,才能還原資料。</translation>
 <translation id="8254954272268479918">關閉 Linux (Beta 版)</translation>
 <translation id="8255451560461371599">無背景圖片</translation>
 <translation id="8256319818471787266">小黃</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index fb8e8ad..788972a9 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -5088,7 +5088,6 @@
 <translation id="8251578425305135684">Isithombe esincane sisusiwe.</translation>
 <translation id="8252569384384439529">Iyalayisha...</translation>
 <translation id="8253198102038551905">Chofoza u-'+' ukuze uthole imininingwane yenethiwekhi</translation>
-<translation id="825483282309623688">Ukuze ubuyise idatha yakho, udinga uxhumo lwe-inthanethi.</translation>
 <translation id="8254954272268479918">Vala i-Linux (Beta)</translation>
 <translation id="8255451560461371599">Akukho okwasemuva</translation>
 <translation id="8256319818471787266">I-Sparky</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 0c1acc8..d8e94540 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -217,7 +217,7 @@
 <translation id="8342675569599923794">Chrome bloqueó este archivo porque es peligroso.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation>
 <translation id="840084489713044809">Google Chrome desea exportar tus contraseñas.</translation>
-<translation id="8455999171311319804">Opcional: Para ayudarnos a mejorar el sistema operativo Chrome, envía datos de uso y diagnóstico a Google.</translation>
+<translation id="8455999171311319804">Opcional: Para ayudarnos a mejorar el Sistema operativo Chrome, envía datos de uso y diagnóstico a Google.</translation>
 <translation id="8498858610309223613">Se acaba de instalar una actualización de seguridad especial para Google Chrome. Reinicia el navegador ahora (se restablecerán tus pestañas).</translation>
 <translation id="8521348052903287641">Regla de entrada para que Google Chrome Dev permita el tráfico mDNS.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/theme/chrome_unscaled_resources.grd b/chrome/app/theme/chrome_unscaled_resources.grd
index e055fd5..e3fe64b 100644
--- a/chrome/app/theme/chrome_unscaled_resources.grd
+++ b/chrome/app/theme/chrome_unscaled_resources.grd
@@ -125,8 +125,8 @@
         <!-- PluginVm icons -->
         <include name="IDR_LOGO_PLUGIN_VM_DEFAULT_32" file="plugin_vm/logo_plugin_vm_default_32.png" type="BINDATA" />
         <include name="IDR_LOGO_PLUGIN_VM_DEFAULT_192" file="plugin_vm/logo_plugin_vm_default_192.png" type="BINDATA" />
-        <include name="IDR_PLUGIN_VM_LAUNCHER" file="plugin_vm/plugin_vm_launcher.png" type="BINDATA" />
-        <include name="IDR_PLUGIN_VM_LAUNCHER_ERROR" file="plugin_vm/plugin_vm_launcher_error.png" type="BINDATA" />
+        <include name="IDR_PLUGIN_VM_INSTALLER" file="plugin_vm/plugin_vm_installer.png" type="BINDATA" />
+        <include name="IDR_PLUGIN_VM_INSTALLER_ERROR" file="plugin_vm/plugin_vm_installer_error.png" type="BINDATA" />
       </if>
     </includes>
   </release>
diff --git a/chrome/app/theme/plugin_vm/plugin_vm_launcher.png b/chrome/app/theme/plugin_vm/plugin_vm_installer.png
similarity index 100%
rename from chrome/app/theme/plugin_vm/plugin_vm_launcher.png
rename to chrome/app/theme/plugin_vm/plugin_vm_installer.png
Binary files differ
diff --git a/chrome/app/theme/plugin_vm/plugin_vm_launcher_error.png b/chrome/app/theme/plugin_vm/plugin_vm_installer_error.png
similarity index 100%
rename from chrome/app/theme/plugin_vm/plugin_vm_launcher_error.png
rename to chrome/app/theme/plugin_vm/plugin_vm_installer_error.png
Binary files differ
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 33c3e7c6..1a51ec0 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2234,6 +2234,10 @@
      flag_descriptions::kDesktopPWAsLocalUpdatingName,
      flag_descriptions::kDesktopPWAsLocalUpdatingDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kDesktopPWAsLocalUpdating)},
+    {"enable-desktop-pwas-tab-strip",
+     flag_descriptions::kDesktopPWAsTabStripName,
+     flag_descriptions::kDesktopPWAsTabStripDescription, kOsDesktop,
+     FEATURE_VALUE_TYPE(features::kDesktopPWAsTabStrip)},
     {"enable-system-webapps", flag_descriptions::kEnableSystemWebAppsName,
      flag_descriptions::kEnableSystemWebAppsDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kSystemWebApps)},
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 5ddf93ee..93deb037 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -54,7 +54,7 @@
         <include name="IDR_DISCARDS_MOJO_PUBLIC_BASE_PROCESS_ID_MOJOM_LITE_JS" file="${root_gen_dir}\mojo\public\mojom\base\process_id.mojom-lite.js" compress="gzip" use_base_dir="false" type="BINDATA" />
         <include name="IDR_DISCARDS_SORTED_TABLE_BEHAVIOR_JS" file="resources\discards\sorted_table_behavior.js" compress="gzip" type="BINDATA" />
       </if>
-      <if expr="is_win or is_macosx or (is_linux and not is_chromeos)">
+      <if expr="is_win or is_macosx or (is_linux and not chromeos)">
         <include name="IDR_BROWSER_SWITCH_APP_JS" file="${root_gen_dir}\chrome\browser\resources\browser_switch\app.js" compress="gzip" use_base_dir="false" type="BINDATA" />
         <include name="IDR_BROWSER_SWITCH_PROXY_JS" file="resources\browser_switch\browser_switch_proxy.js" compress="gzip" type="BINDATA" />
         <include name="IDR_BROWSER_SWITCH_HTML" file="resources\browser_switch\browser_switch.html" compress="gzip" allowexternalscript="true" type="BINDATA" />
diff --git a/chrome/browser/captive_portal/captive_portal_browsertest.cc b/chrome/browser/captive_portal/captive_portal_browsertest.cc
index d6b5fef..a487cef 100644
--- a/chrome/browser/captive_portal/captive_portal_browsertest.cc
+++ b/chrome/browser/captive_portal/captive_portal_browsertest.cc
@@ -71,7 +71,6 @@
 #include "content/public/test/url_loader_interceptor.h"
 #include "net/base/net_errors.h"
 #include "net/cert/x509_certificate.h"
-#include "net/dns/mock_host_resolver.h"
 #include "net/http/transport_security_state.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -911,9 +910,6 @@
       std::make_unique<content::URLLoaderInterceptor>(base::Bind(
           &CaptivePortalBrowserTest::OnIntercept, base::Unretained(this)));
 
-  // Do not introduce DNS errors.
-  host_resolver()->AddRule("*", "127.0.0.1");
-
   // Double-check that the captive portal service isn't enabled by default for
   // browser tests.
   EXPECT_EQ(CaptivePortalService::DISABLED_FOR_TESTING,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index efa9948..6512b5eb 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1685,10 +1685,10 @@
     "plugin_vm/plugin_vm_files.h",
     "plugin_vm/plugin_vm_image_download_client.cc",
     "plugin_vm/plugin_vm_image_download_client.h",
-    "plugin_vm/plugin_vm_image_manager.cc",
-    "plugin_vm/plugin_vm_image_manager.h",
-    "plugin_vm/plugin_vm_image_manager_factory.cc",
-    "plugin_vm/plugin_vm_image_manager_factory.h",
+    "plugin_vm/plugin_vm_installer.cc",
+    "plugin_vm/plugin_vm_installer.h",
+    "plugin_vm/plugin_vm_installer_factory.cc",
+    "plugin_vm/plugin_vm_installer_factory.h",
     "plugin_vm/plugin_vm_manager.cc",
     "plugin_vm/plugin_vm_manager.h",
     "plugin_vm/plugin_vm_metrics_util.cc",
@@ -2854,7 +2854,7 @@
     "note_taking_helper_unittest.cc",
     "ownership/owner_settings_service_chromeos_unittest.cc",
     "plugin_vm/plugin_vm_files_unittest.cc",
-    "plugin_vm/plugin_vm_image_manager_unittest.cc",
+    "plugin_vm/plugin_vm_installer_unittest.cc",
     "plugin_vm/plugin_vm_manager_unittest.cc",
     "plugin_vm/plugin_vm_test_helper.cc",
     "plugin_vm/plugin_vm_test_helper.h",
diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc
index c8e4095..29485df 100644
--- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc
+++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc
@@ -404,21 +404,27 @@
 
     tree_source = GetFromKey(KeyForInputMethod());
   } else {
-    if (event_data->task_id == kNoTaskId)
-      return;
-
     aura::Window* active_window = GetActiveWindow();
     if (!active_window)
       return;
 
-    int32_t task_id = arc::GetWindowTaskId(active_window);
-    if (task_id != event_data->task_id)
-      return;
+    auto task_id = arc::GetWindowTaskId(active_window);
+    if (event_data->task_id != kNoTaskId) {
+      // Event data has task ID. Check task ID.
+      if (task_id != event_data->task_id)
+        return;
+    } else {
+      // Event data does not have task ID. Check window ID instead.
+      auto window_id = exo::GetShellClientAccessibilityId(active_window);
+      if (window_id != event_data->window_id)
+        return;
+    }
 
-    tree_source = GetFromKey(KeyForTaskId(task_id));
+    auto key = KeyForTaskId(task_id);
+    tree_source = GetFromKey(key);
 
     if (!tree_source) {
-      tree_source = CreateFromKey(KeyForTaskId(event_data->task_id));
+      tree_source = CreateFromKey(key);
 
       ui::AXTreeData tree_data;
       tree_source->GetTreeData(&tree_data);
diff --git a/chrome/browser/chromeos/child_accounts/screen_time_controller.cc b/chrome/browser/chromeos/child_accounts/screen_time_controller.cc
index cf977c8..95494699 100644
--- a/chrome/browser/chromeos/child_accounts/screen_time_controller.cc
+++ b/chrome/browser/chromeos/child_accounts/screen_time_controller.cc
@@ -65,7 +65,6 @@
 
 // static
 void ScreenTimeController::RegisterProfilePrefs(PrefRegistrySimple* registry) {
-  registry->RegisterDictionaryPref(prefs::kPerAppTimeLimitsPolicy);
   registry->RegisterDictionaryPref(prefs::kScreenTimeLastState);
   registry->RegisterDictionaryPref(prefs::kTimeLimitLocalOverride);
   registry->RegisterDictionaryPref(prefs::kUsageTimeLimit);
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
index 2877b09a..605bd88 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
@@ -10,6 +10,8 @@
 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
 
 namespace chromeos {
 namespace app_time {
@@ -19,6 +21,12 @@
   return base::FeatureList::IsEnabled(features::kPerAppTimeLimits);
 }
 
+// static
+void AppTimeController::RegisterProfilePrefs(PrefRegistrySimple* registry) {
+  registry->RegisterDictionaryPref(prefs::kPerAppTimeLimitsPolicy);
+  registry->RegisterDictionaryPref(prefs::kPerAppTimeLimitsWhitelistPolicy);
+}
+
 AppTimeController::AppTimeController(Profile* profile)
     : app_service_wrapper_(std::make_unique<AppServiceWrapper>(profile)),
       app_registry_(
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h
index d74dbc4..438296d 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 class Profile;
+class PrefRegistrySimple;
 
 namespace chromeos {
 namespace app_time {
@@ -20,6 +21,10 @@
 class AppTimeController {
  public:
   static bool ArePerAppTimeLimitsEnabled();
+
+  // Registers preferences
+  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
   explicit AppTimeController(Profile* profile);
   AppTimeController(const AppTimeController&) = delete;
   AppTimeController& operator=(const AppTimeController&) = delete;
diff --git a/chrome/browser/chromeos/crostini/crostini_export_import.cc b/chrome/browser/chromeos/crostini/crostini_export_import.cc
index 76b41624..f613988b 100644
--- a/chrome/browser/chromeos/crostini/crostini_export_import.cc
+++ b/chrome/browser/chromeos/crostini/crostini_export_import.cc
@@ -616,14 +616,15 @@
   return status_trackers_.find(id) != status_trackers_.end();
 }
 
-CrostiniExportImportNotificationController*
+base::WeakPtr<CrostiniExportImportNotificationController>
 CrostiniExportImport::GetNotificationControllerForTesting(
     ContainerId container_id) {
   auto it = status_trackers_.find(container_id);
   if (it == status_trackers_.end()) {
     return nullptr;
   }
-  return static_cast<CrostiniExportImportNotificationController*>(it->second);
+  return static_cast<CrostiniExportImportNotificationController*>(it->second)
+      ->GetWeakPtr();
 }
 
 }  // namespace crostini
diff --git a/chrome/browser/chromeos/crostini/crostini_export_import.h b/chrome/browser/chromeos/crostini/crostini_export_import.h
index 3583f150..24c86fe 100644
--- a/chrome/browser/chromeos/crostini/crostini_export_import.h
+++ b/chrome/browser/chromeos/crostini/crostini_export_import.h
@@ -117,7 +117,7 @@
   // Whether an export or import is currently in progress.
   bool GetExportImportOperationStatus() const;
 
-  CrostiniExportImportNotificationController*
+  base::WeakPtr<CrostiniExportImportNotificationController>
   GetNotificationControllerForTesting(ContainerId container_id);
 
  private:
diff --git a/chrome/browser/chromeos/crostini/crostini_export_import_notification_controller.h b/chrome/browser/chromeos/crostini/crostini_export_import_notification_controller.h
index c83495c..73fcea4 100644
--- a/chrome/browser/chromeos/crostini/crostini_export_import_notification_controller.h
+++ b/chrome/browser/chromeos/crostini/crostini_export_import_notification_controller.h
@@ -49,6 +49,9 @@
   message_center::Notification* get_notification() {
     return notification_.get();
   }
+  base::WeakPtr<CrostiniExportImportNotificationController> GetWeakPtr() {
+    return weak_ptr_factory_.GetWeakPtr();
+  }
 
   // message_center::NotificationObserver:
   void Close(bool by_user) override;
diff --git a/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc b/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc
index fd002dc..07fead76 100644
--- a/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc
@@ -42,7 +42,7 @@
 
 class CrostiniExportImportTest : public testing::Test {
  public:
-  CrostiniExportImportNotificationController* GetController() {
+  base::WeakPtr<CrostiniExportImportNotificationController> GetController() {
     return crostini_export_import_->GetNotificationControllerForTesting(
         container_id_);
   }
@@ -163,31 +163,46 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::EXPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // 20% PACK = 10% overall.
   SendExportProgress(vm_tools::cicerone::
                          ExportLxdContainerProgressSignal_Status_EXPORTING_PACK,
                      {.progress_percent = 20});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 10);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 10);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // 20% DOWNLOAD = 60% overall.
   SendExportProgress(
       vm_tools::cicerone::
           ExportLxdContainerProgressSignal_Status_EXPORTING_DOWNLOAD,
       {.progress_percent = 20});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 60);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 60);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Close notification and update progress. Should not update notification.
   controller->Close(false);
@@ -195,17 +210,29 @@
       vm_tools::cicerone::
           ExportLxdContainerProgressSignal_Status_EXPORTING_DOWNLOAD,
       {.progress_percent = 40});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 60);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 60);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Done.
   SendExportProgress(
       vm_tools::cicerone::ExportLxdContainerProgressSignal_Status_DONE);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::DONE);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
+
   // CrostiniExportImport should've created the exported file.
   task_environment_.RunUntilIdle();
   EXPECT_TRUE(base::PathExists(tarball_));
@@ -216,12 +243,17 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::EXPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // STREAMING 10% bytes done + 30% files done = 20% overall.
   SendExportProgress(
@@ -231,10 +263,15 @@
        .total_bytes = 100,
        .files_streamed = 30,
        .bytes_streamed = 10});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 20);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 20);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // STREAMING 66% bytes done + 55% files done then floored = 60% overall.
   SendExportProgress(
@@ -244,10 +281,15 @@
        .total_bytes = 100,
        .files_streamed = 55,
        .bytes_streamed = 66});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 60);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 60);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Close notification and update progress. Should not update notification.
   controller->Close(false);
@@ -258,17 +300,29 @@
        .total_bytes = 100,
        .files_streamed = 90,
        .bytes_streamed = 85});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 60);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 60);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Done.
   SendExportProgress(
       vm_tools::cicerone::ExportLxdContainerProgressSignal_Status_DONE);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::DONE);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
+
   // CrostiniExportImport should've created the exported file.
   task_environment_.RunUntilIdle();
   EXPECT_TRUE(base::PathExists(tarball_));
@@ -279,14 +333,31 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::EXPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Failed.
   SendExportProgress(
       vm_tools::cicerone::ExportLxdContainerProgressSignal_Status_FAILED);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::FAILED_UNKNOWN_REASON);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
+
   // CrostiniExportImport should cleanup the file if an export fails.
   task_environment_.RunUntilIdle();
   EXPECT_FALSE(base::PathExists(tarball_));
@@ -297,20 +368,30 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::EXPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // CANCELLING:
   crostini_export_import_->CancelOperation(ExportImportType::EXPORT,
                                            container_id_);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::CANCELLING);
-  EXPECT_EQ(controller->get_notification()->progress(), -1);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), -1);
+    EXPECT_FALSE(notification->pinned());
+  }
   EXPECT_TRUE(base::PathExists(tarball_));
 
   // STREAMING: should not be displayed as cancel is in progress
@@ -321,16 +402,30 @@
        .total_bytes = 100,
        .files_streamed = 50,
        .bytes_streamed = 50});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::CANCELLING);
-  EXPECT_EQ(controller->get_notification()->progress(), -1);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), -1);
+    EXPECT_FALSE(notification->pinned());
+  }
   EXPECT_TRUE(base::PathExists(tarball_));
 
   // CANCELLED:
   SendExportProgress(
       vm_tools::cicerone::ExportLxdContainerProgressSignal_Status_CANCELLED);
-  EXPECT_FALSE(GetController());
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::CANCELLED);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
+
   task_environment_.RunUntilIdle();
   EXPECT_FALSE(base::PathExists(tarball_));
 }
@@ -340,26 +435,45 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::EXPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // CANCELLING:
   crostini_export_import_->CancelOperation(ExportImportType::EXPORT,
                                            container_id_);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::CANCELLING);
-  EXPECT_EQ(controller->get_notification()->progress(), -1);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), -1);
+    EXPECT_FALSE(notification->pinned());
+  }
   EXPECT_TRUE(base::PathExists(tarball_));
 
   // DONE: Completed before cancel processed, file should be deleted.
   SendExportProgress(
       vm_tools::cicerone::ExportLxdContainerProgressSignal_Status_DONE);
-  EXPECT_FALSE(GetController());
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::CANCELLED);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
+
   task_environment_.RunUntilIdle();
   EXPECT_FALSE(base::PathExists(tarball_));
 }
@@ -369,32 +483,47 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::IMPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // 20% UPLOAD = 10% overall.
   SendImportProgress(
       vm_tools::cicerone::
           ImportLxdContainerProgressSignal_Status_IMPORTING_UPLOAD,
       {.progress_percent = 20});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 10);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 10);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // 20% UNPACK = 60% overall.
   SendImportProgress(
       vm_tools::cicerone::
           ImportLxdContainerProgressSignal_Status_IMPORTING_UNPACK,
       {.progress_percent = 20});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 60);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 60);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Close notification and update progress. Should not update notification.
   controller->Close(false);
@@ -402,17 +531,28 @@
       vm_tools::cicerone::
           ImportLxdContainerProgressSignal_Status_IMPORTING_UNPACK,
       {.progress_percent = 40});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 60);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 60);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Done.
   SendImportProgress(
       vm_tools::cicerone::ImportLxdContainerProgressSignal_Status_DONE);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::DONE);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
 }
 
 TEST_F(CrostiniExportImportTest, TestImportFail) {
@@ -420,16 +560,32 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::IMPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Failed.
   SendImportProgress(
       vm_tools::cicerone::ImportLxdContainerProgressSignal_Status_FAILED);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::FAILED_UNKNOWN_REASON);
-  EXPECT_FALSE(controller->get_notification()->pinned());
-  std::string msg("Restoring couldn't be completed due to an error");
-  EXPECT_EQ(controller->get_notification()->message(), base::UTF8ToUTF16(msg));
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+    std::string msg("Restoring couldn't be completed due to an error");
+    EXPECT_EQ(notification->message(), base::UTF8ToUTF16(msg));
+  }
 }
 
 TEST_F(CrostiniExportImportTest, TestImportCancelled) {
@@ -437,35 +593,58 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::IMPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // CANCELLING:
   crostini_export_import_->CancelOperation(ExportImportType::IMPORT,
                                            container_id_);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::CANCELLING);
-  EXPECT_EQ(controller->get_notification()->progress(), -1);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), -1);
+    EXPECT_FALSE(notification->pinned());
+  }
 
   // STREAMING: should not be displayed as cancel is in progress
   SendImportProgress(
       vm_tools::cicerone::
           ImportLxdContainerProgressSignal_Status_IMPORTING_UPLOAD,
       {.progress_percent = 50});
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::CANCELLING);
-  EXPECT_EQ(controller->get_notification()->progress(), -1);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), -1);
+    EXPECT_FALSE(notification->pinned());
+  }
 
   // CANCELLED:
   SendImportProgress(
       vm_tools::cicerone::ImportLxdContainerProgressSignal_Status_CANCELLED);
-  EXPECT_FALSE(GetController());
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::CANCELLED);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
 }
 
 TEST_F(CrostiniExportImportTest, TestImportDoneBeforeCancelled) {
@@ -473,27 +652,43 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::IMPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
   ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::RUNNING);
-  EXPECT_EQ(controller->get_notification()->progress(), 0);
-  EXPECT_TRUE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // CANCELLING:
   crostini_export_import_->CancelOperation(ExportImportType::IMPORT,
                                            container_id_);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::CANCELLING);
-  EXPECT_EQ(controller->get_notification()->progress(), -1);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), -1);
+    EXPECT_FALSE(notification->pinned());
+  }
 
   // DONE: Cancel couldn't be processed in time, done is displayed instead.
   SendImportProgress(
       vm_tools::cicerone::ImportLxdContainerProgressSignal_Status_DONE);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(controller->status(),
             CrostiniExportImportStatusTracker::Status::DONE);
-  EXPECT_FALSE(controller->get_notification()->pinned());
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+  }
 }
 
 TEST_F(CrostiniExportImportTest, TestImportFailArchitecture) {
@@ -501,22 +696,38 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::IMPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Failed Architecture.
   SendImportProgress(
       vm_tools::cicerone::
           ImportLxdContainerProgressSignal_Status_FAILED_ARCHITECTURE);
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(
       controller->status(),
       CrostiniExportImportStatusTracker::Status::FAILED_ARCHITECTURE_MISMATCH);
-  EXPECT_FALSE(controller->get_notification()->pinned());
-  std::string msg(
-      "Cannot import container architecture type arch_con with this device "
-      "which is arch_dev. You can try restoring this container into a "
-      "different device, or you can access the files inside this container "
-      "image by opening in Files app.");
-  EXPECT_EQ(controller->get_notification()->message(), base::UTF8ToUTF16(msg));
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+    std::string msg(
+        "Cannot import container architecture type arch_con with this device "
+        "which is arch_dev. You can try restoring this container into a "
+        "different device, or you can access the files inside this container "
+        "image by opening in Files app.");
+    EXPECT_EQ(notification->message(), base::UTF8ToUTF16(msg));
+  }
 }
 
 TEST_F(CrostiniExportImportTest, TestImportFailSpace) {
@@ -524,7 +735,17 @@
       tarball_, 0,
       crostini_export_import_->NewOperationData(ExportImportType::IMPORT));
   task_environment_.RunUntilIdle();
-  CrostiniExportImportNotificationController* controller = GetController();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController();
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_EQ(notification->progress(), 0);
+    EXPECT_TRUE(notification->pinned());
+  }
 
   // Failed Space.
   SendImportProgress(
@@ -533,14 +754,20 @@
           .available_space = 20ul * 1'024 * 1'024 * 1'024,    // 20Gb
           .min_required_space = 35ul * 1'024 * 1'024 * 1'024  // 35Gb
       });
+  ASSERT_EQ(GetController(), nullptr);
+  ASSERT_NE(controller, nullptr);
   EXPECT_EQ(
       controller->status(),
       CrostiniExportImportStatusTracker::Status::FAILED_INSUFFICIENT_SPACE);
-  EXPECT_FALSE(controller->get_notification()->pinned());
-  std::string msg =
-      "Cannot restore due to lack of storage space. Free up 15.0 GB from the "
-      "device and try again.";
-  EXPECT_EQ(controller->get_notification()->message(), base::UTF8ToUTF16(msg));
+  {
+    message_center::Notification* notification = controller->get_notification();
+    ASSERT_NE(notification, nullptr);
+    EXPECT_FALSE(notification->pinned());
+    std::string msg =
+        "Cannot restore due to lack of storage space. Free up 15.0 GB from the "
+        "device and try again.";
+    EXPECT_EQ(notification->message(), base::UTF8ToUTF16(msg));
+  }
 }
 
 }  // namespace crostini
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index fee712e..cc76f53 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -95,7 +95,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
 #include "chrome/browser/ui/views/crostini/crostini_uninstaller_view.h"
-#include "chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h"
+#include "chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h"
 #include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
@@ -1845,8 +1845,8 @@
   Profile* profile = Profile::FromBrowserContext(browser_context());
   plugin_vm::SetFakePluginVmPolicy(profile, params->image_url,
                                    params->image_hash, params->license_key);
-  plugin_vm::ShowPluginVmLauncherView(profile);
-  PluginVmLauncherView::GetActiveViewForTesting()
+  plugin_vm::ShowPluginVmInstallerView(profile);
+  PluginVmInstallerView::GetActiveViewForTesting()
       ->SetFinishedCallbackForTesting(base::BindOnce(
           &AutotestPrivateInstallPluginVMFunction::OnInstallFinished, this));
 
@@ -1860,7 +1860,7 @@
   }
 
   // Dismiss the dialog and start launching the VM.
-  PluginVmLauncherView::GetActiveViewForTesting()->AcceptDialog();
+  PluginVmInstallerView::GetActiveViewForTesting()->AcceptDialog();
 
   Respond(NoArguments());
 }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index 28216bd..ef3f8e5 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -1022,6 +1022,7 @@
   model->GetRecentFiles(
       file_system_context.get(),
       Extension::GetBaseURLFromExtensionId(extension_id()),
+      chromeos::RecentModel::FileType::kAll,
       base::BindOnce(
           &FileManagerPrivateInternalGetRecentFilesFunction::OnGetRecentFiles,
           this, params->restriction));
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index 15d9a5f9..132d5ae 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -464,6 +464,7 @@
         TestCase("openQuickViewUsb"),
         TestCase("openQuickViewRemovablePartitions"),
         TestCase("openQuickViewMtp"),
+        TestCase("openQuickViewTabIndexImage"),
         TestCase("pressEnterOnInfoBoxToOpenClose"),
         TestCase("closeQuickView"),
         TestCase("cantOpenQuickViewWithMultipleFiles"),
diff --git a/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc b/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc
index a94344e..6e371b5e 100644
--- a/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc
+++ b/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc
@@ -322,6 +322,7 @@
     root->GetRecentFiles(
         Params(params_.value().file_system_context(), params_.value().origin(),
                params_.value().max_files(), params_.value().cutoff_time(),
+               params_.value().file_type(),
                base::BindOnce(&RecentArcMediaSource::OnGetRecentFilesForRoot,
                               weak_ptr_factory_.GetWeakPtr())));
   }
diff --git a/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc b/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc
index d8353ec..3e2eebaf 100644
--- a/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc
+++ b/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc
@@ -124,6 +124,7 @@
     source_->GetRecentFiles(RecentSource::Params(
         nullptr /* file_system_context */, GURL() /* origin */,
         1 /* max_files: ignored */, base::Time() /* cutoff_time: ignored */,
+        RecentSource::FileType::kAll /* file_type: ignored */,
         base::BindOnce(
             [](base::RunLoop* run_loop, std::vector<RecentFile>* out_files,
                std::vector<RecentFile> files) {
diff --git a/chrome/browser/chromeos/fileapi/recent_disk_source_unittest.cc b/chrome/browser/chromeos/fileapi/recent_disk_source_unittest.cc
index 4eb3b907..f4de11a 100644
--- a/chrome/browser/chromeos/fileapi/recent_disk_source_unittest.cc
+++ b/chrome/browser/chromeos/fileapi/recent_disk_source_unittest.cc
@@ -77,6 +77,7 @@
 
     source_->GetRecentFiles(RecentSource::Params(
         file_system_context_.get(), origin_, max_files, cutoff_time,
+        RecentSource::FileType::kAll,
         base::BindOnce(
             [](base::RunLoop* run_loop, std::vector<RecentFile>* out_files,
                std::vector<RecentFile> files) {
diff --git a/chrome/browser/chromeos/fileapi/recent_model.cc b/chrome/browser/chromeos/fileapi/recent_model.cc
index fb994f8..074fe4e9 100644
--- a/chrome/browser/chromeos/fileapi/recent_model.cc
+++ b/chrome/browser/chromeos/fileapi/recent_model.cc
@@ -87,6 +87,7 @@
 void RecentModel::GetRecentFiles(
     storage::FileSystemContext* file_system_context,
     const GURL& origin,
+    FileType file_type,
     GetRecentFilesCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
@@ -122,7 +123,7 @@
 
   for (const auto& source : sources_) {
     source->GetRecentFiles(RecentSource::Params(
-        file_system_context, origin, max_files_, cutoff_time,
+        file_system_context, origin, max_files_, cutoff_time, file_type,
         base::BindOnce(&RecentModel::OnGetRecentFiles,
                        weak_ptr_factory_.GetWeakPtr(), max_files_,
                        cutoff_time)));
diff --git a/chrome/browser/chromeos/fileapi/recent_model.h b/chrome/browser/chromeos/fileapi/recent_model.h
index 454178f3..aa02ee3 100644
--- a/chrome/browser/chromeos/fileapi/recent_model.h
+++ b/chrome/browser/chromeos/fileapi/recent_model.h
@@ -42,6 +42,7 @@
  public:
   using GetRecentFilesCallback =
       base::OnceCallback<void(const std::vector<RecentFile>& files)>;
+  using FileType = RecentSource::FileType;
 
   ~RecentModel() override;
 
@@ -57,6 +58,7 @@
   // Results might be internally cached for better performance.
   void GetRecentFiles(storage::FileSystemContext* file_system_context,
                       const GURL& origin,
+                      FileType file_type,
                       GetRecentFilesCallback callback);
 
   // KeyedService overrides:
diff --git a/chrome/browser/chromeos/fileapi/recent_model_unittest.cc b/chrome/browser/chromeos/fileapi/recent_model_unittest.cc
index 8d5aa86..b1c3db3 100644
--- a/chrome/browser/chromeos/fileapi/recent_model_unittest.cc
+++ b/chrome/browser/chromeos/fileapi/recent_model_unittest.cc
@@ -35,11 +35,11 @@
 std::vector<std::unique_ptr<RecentSource>> BuildDefaultSources() {
   auto source1 = std::make_unique<FakeRecentSource>();
   source1->AddFile(MakeRecentFile("aaa.jpg", base::Time::FromJavaTime(1000)));
-  source1->AddFile(MakeRecentFile("ccc.jpg", base::Time::FromJavaTime(3000)));
+  source1->AddFile(MakeRecentFile("ccc.mp4", base::Time::FromJavaTime(3000)));
 
   auto source2 = std::make_unique<FakeRecentSource>();
-  source2->AddFile(MakeRecentFile("bbb.jpg", base::Time::FromJavaTime(2000)));
-  source2->AddFile(MakeRecentFile("ddd.jpg", base::Time::FromJavaTime(4000)));
+  source2->AddFile(MakeRecentFile("bbb.png", base::Time::FromJavaTime(2000)));
+  source2->AddFile(MakeRecentFile("ddd.ogg", base::Time::FromJavaTime(4000)));
 
   std::vector<std::unique_ptr<RecentSource>> sources;
   sources.emplace_back(std::move(source1));
@@ -60,7 +60,8 @@
   std::vector<RecentFile> BuildModelAndGetRecentFiles(
       RecentSourceListFactory source_list_factory,
       size_t max_files,
-      const base::Time& cutoff_time) {
+      const base::Time& cutoff_time,
+      RecentModel::FileType file_type) {
     RecentModel* model = static_cast<RecentModel*>(
         RecentModelFactory::GetInstance()->SetTestingFactoryAndUse(
             &profile_,
@@ -80,7 +81,7 @@
     base::RunLoop run_loop;
 
     model->GetRecentFiles(
-        nullptr /* file_system_context */, GURL() /* origin */,
+        nullptr /* file_system_context */, GURL() /* origin */, file_type,
         base::BindOnce(
             [](base::RunLoop* run_loop, std::vector<RecentFile>* files_out,
                const std::vector<RecentFile>& files) {
@@ -99,42 +100,44 @@
 };
 
 TEST_F(RecentModelTest, GetRecentFiles) {
-  std::vector<RecentFile> files = BuildModelAndGetRecentFiles(
-      base::BindRepeating(&BuildDefaultSources), 10, base::Time());
+  std::vector<RecentFile> files =
+      BuildModelAndGetRecentFiles(base::BindRepeating(&BuildDefaultSources), 10,
+                                  base::Time(), RecentModel::FileType::kAll);
 
   ASSERT_EQ(4u, files.size());
-  EXPECT_EQ("ddd.jpg", files[0].url().path().value());
+  EXPECT_EQ("ddd.ogg", files[0].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(4000), files[0].last_modified());
-  EXPECT_EQ("ccc.jpg", files[1].url().path().value());
+  EXPECT_EQ("ccc.mp4", files[1].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(3000), files[1].last_modified());
-  EXPECT_EQ("bbb.jpg", files[2].url().path().value());
+  EXPECT_EQ("bbb.png", files[2].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(2000), files[2].last_modified());
   EXPECT_EQ("aaa.jpg", files[3].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(1000), files[3].last_modified());
 }
 
 TEST_F(RecentModelTest, GetRecentFiles_MaxFiles) {
-  std::vector<RecentFile> files = BuildModelAndGetRecentFiles(
-      base::BindRepeating(&BuildDefaultSources), 3, base::Time());
+  std::vector<RecentFile> files =
+      BuildModelAndGetRecentFiles(base::BindRepeating(&BuildDefaultSources), 3,
+                                  base::Time(), RecentModel::FileType::kAll);
 
   ASSERT_EQ(3u, files.size());
-  EXPECT_EQ("ddd.jpg", files[0].url().path().value());
+  EXPECT_EQ("ddd.ogg", files[0].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(4000), files[0].last_modified());
-  EXPECT_EQ("ccc.jpg", files[1].url().path().value());
+  EXPECT_EQ("ccc.mp4", files[1].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(3000), files[1].last_modified());
-  EXPECT_EQ("bbb.jpg", files[2].url().path().value());
+  EXPECT_EQ("bbb.png", files[2].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(2000), files[2].last_modified());
 }
 
 TEST_F(RecentModelTest, GetRecentFiles_CutoffTime) {
-  std::vector<RecentFile> files =
-      BuildModelAndGetRecentFiles(base::BindRepeating(&BuildDefaultSources), 10,
-                                  base::Time::FromJavaTime(2500));
+  std::vector<RecentFile> files = BuildModelAndGetRecentFiles(
+      base::BindRepeating(&BuildDefaultSources), 10,
+      base::Time::FromJavaTime(2500), RecentModel::FileType::kAll);
 
   ASSERT_EQ(2u, files.size());
-  EXPECT_EQ("ddd.jpg", files[0].url().path().value());
+  EXPECT_EQ("ddd.ogg", files[0].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(4000), files[0].last_modified());
-  EXPECT_EQ("ccc.jpg", files[1].url().path().value());
+  EXPECT_EQ("ccc.mp4", files[1].url().path().value());
   EXPECT_EQ(base::Time::FromJavaTime(3000), files[1].last_modified());
 }
 
@@ -143,9 +146,41 @@
 
   BuildModelAndGetRecentFiles(
       base::BindRepeating([]() { return RecentSourceList(); }), 10,
-      base::Time());
+      base::Time(), RecentModel::FileType::kAll);
 
   histogram_tester.ExpectTotalCount(RecentModel::kLoadHistogramName, 1);
 }
 
+TEST_F(RecentModelTest, GetRecentFiles_Audio) {
+  std::vector<RecentFile> files =
+      BuildModelAndGetRecentFiles(base::BindRepeating(&BuildDefaultSources), 10,
+                                  base::Time(), RecentModel::FileType::kAudio);
+
+  ASSERT_EQ(1u, files.size());
+  EXPECT_EQ("ddd.ogg", files[0].url().path().value());
+  EXPECT_EQ(base::Time::FromJavaTime(4000), files[0].last_modified());
+}
+
+TEST_F(RecentModelTest, GetRecentFiles_Image) {
+  std::vector<RecentFile> files =
+      BuildModelAndGetRecentFiles(base::BindRepeating(&BuildDefaultSources), 10,
+                                  base::Time(), RecentModel::FileType::kImage);
+
+  ASSERT_EQ(2u, files.size());
+  EXPECT_EQ("bbb.png", files[0].url().path().value());
+  EXPECT_EQ(base::Time::FromJavaTime(2000), files[0].last_modified());
+  EXPECT_EQ("aaa.jpg", files[1].url().path().value());
+  EXPECT_EQ(base::Time::FromJavaTime(1000), files[1].last_modified());
+}
+
+TEST_F(RecentModelTest, GetRecentFiles_Video) {
+  std::vector<RecentFile> files =
+      BuildModelAndGetRecentFiles(base::BindRepeating(&BuildDefaultSources), 10,
+                                  base::Time(), RecentModel::FileType::kVideo);
+
+  ASSERT_EQ(1u, files.size());
+  EXPECT_EQ("ccc.mp4", files[0].url().path().value());
+  EXPECT_EQ(base::Time::FromJavaTime(3000), files[0].last_modified());
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/fileapi/recent_source.cc b/chrome/browser/chromeos/fileapi/recent_source.cc
index 29c9155..39ed54e7 100644
--- a/chrome/browser/chromeos/fileapi/recent_source.cc
+++ b/chrome/browser/chromeos/fileapi/recent_source.cc
@@ -14,11 +14,13 @@
                              const GURL& origin,
                              size_t max_files,
                              const base::Time& cutoff_time,
+                             FileType file_type,
                              GetRecentFilesCallback callback)
     : file_system_context_(file_system_context),
       origin_(origin),
       max_files_(max_files),
       cutoff_time_(cutoff_time),
+      file_type_(file_type),
       callback_(std::move(callback)) {
   DCHECK(!callback_.is_null());
 }
diff --git a/chrome/browser/chromeos/fileapi/recent_source.h b/chrome/browser/chromeos/fileapi/recent_source.h
index b4d850a2..4f0cddb0 100644
--- a/chrome/browser/chromeos/fileapi/recent_source.h
+++ b/chrome/browser/chromeos/fileapi/recent_source.h
@@ -35,6 +35,14 @@
   using GetRecentFilesCallback =
       base::OnceCallback<void(std::vector<RecentFile> files)>;
 
+  // File types to filter the results of GetRecentFiles().
+  enum class FileType {
+    kAll,
+    kAudio,
+    kImage,
+    kVideo,
+  };
+
   // Parameters passed to GetRecentFiles().
   class Params {
    public:
@@ -42,6 +50,7 @@
            const GURL& origin,
            size_t max_files,
            const base::Time& cutoff_time,
+           FileType file_type,
            GetRecentFilesCallback callback);
 
     Params(const Params& other) = delete;
@@ -68,6 +77,10 @@
     // requested here, but they will be filtered out by RecentModel.
     const base::Time& cutoff_time() const { return cutoff_time_; }
 
+    // File type to filter the results from RecentSource. RecentSource is
+    // expected to return files which matches the specified file type.
+    FileType file_type() const { return file_type_; }
+
     // Callback to be called for the result of GetRecentFiles().
     GetRecentFilesCallback& callback() { return callback_; }
 
@@ -76,6 +89,7 @@
     GURL origin_;
     size_t max_files_;
     base::Time cutoff_time_;
+    FileType file_type_;
     GetRecentFilesCallback callback_;
   };
 
diff --git a/chrome/browser/chromeos/fileapi/test/fake_recent_source.cc b/chrome/browser/chromeos/fileapi/test/fake_recent_source.cc
index a8fad18..1f33bd33c 100644
--- a/chrome/browser/chromeos/fileapi/test/fake_recent_source.cc
+++ b/chrome/browser/chromeos/fileapi/test/fake_recent_source.cc
@@ -4,9 +4,11 @@
 
 #include "chrome/browser/chromeos/fileapi/test/fake_recent_source.h"
 
+#include <string>
 #include <utility>
 
 #include "chrome/browser/chromeos/fileapi/recent_file.h"
+#include "net/base/mime_util.h"
 
 namespace chromeos {
 
@@ -19,7 +21,33 @@
 }
 
 void FakeRecentSource::GetRecentFiles(Params params) {
-  std::move(params.callback()).Run(canned_files_);
+  std::vector<RecentFile> result;
+  for (const auto& file : canned_files_) {
+    if (MatchesFileType(file, params.file_type()))
+      result.push_back(file);
+  }
+  std::move(params.callback()).Run(std::move(result));
+}
+
+bool FakeRecentSource::MatchesFileType(const RecentFile& file,
+                                       RecentSource::FileType file_type) const {
+  if (file_type == FileType::kAll)
+    return true;
+
+  std::string mime_type;
+  if (!net::GetMimeTypeFromFile(file.url().path(), &mime_type))
+    return false;
+
+  switch (file_type) {
+    case FileType::kAudio:
+      return net::MatchesMimeType("audio/*", mime_type);
+    case FileType::kImage:
+      return net::MatchesMimeType("image/*", mime_type);
+    case FileType::kVideo:
+      return net::MatchesMimeType("video/*", mime_type);
+    default:
+      return false;
+  }
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/fileapi/test/fake_recent_source.h b/chrome/browser/chromeos/fileapi/test/fake_recent_source.h
index 73928925..df504300 100644
--- a/chrome/browser/chromeos/fileapi/test/fake_recent_source.h
+++ b/chrome/browser/chromeos/fileapi/test/fake_recent_source.h
@@ -29,6 +29,10 @@
   void GetRecentFiles(Params params) override;
 
  private:
+  // Returns true if the file matches the given file type.
+  bool MatchesFileType(const RecentFile& file,
+                       RecentSource::FileType file_type) const;
+
   std::vector<RecentFile> canned_files_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeRecentSource);
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.cc
index 828cbb3..332f37d 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.cc
@@ -17,7 +17,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -70,9 +69,9 @@
 
 // Converts a DriveApiErrorCode to the closest equivalent FailureReason.
 // Do not call with 2xx and 3xx error codes.
-plugin_vm::PluginVmImageManager::FailureReason ConvertToFailureReason(
+plugin_vm::PluginVmInstaller::FailureReason ConvertToFailureReason(
     google_apis::DriveApiErrorCode error_code) {
-  using FailureReason = plugin_vm::PluginVmImageManager::FailureReason;
+  using FailureReason = plugin_vm::PluginVmInstaller::FailureReason;
 
   switch (error_code) {
     case google_apis::HTTP_BAD_REQUEST:
@@ -115,9 +114,9 @@
     default;
 
 PluginVmDriveImageDownloadService::PluginVmDriveImageDownloadService(
-    PluginVmImageManager* plugin_vm_image_manager,
+    PluginVmInstaller* plugin_vm_installer,
     Profile* profile)
-    : plugin_vm_image_manager_(plugin_vm_image_manager),
+    : plugin_vm_installer_(plugin_vm_installer),
       secure_hash_service_(
           crypto::SecureHash::Create(crypto::SecureHash::SHA256)) {
   signin::IdentityManager* identity_manager =
@@ -175,10 +174,10 @@
             &PluginVmDriveImageDownloadService::ProgressCallback,
             weak_ptr_factory_.GetWeakPtr()));
 
-    plugin_vm_image_manager_->OnDownloadStarted();
+    plugin_vm_installer_->OnDownloadStarted();
   } else {
-    plugin_vm_image_manager_->OnDownloadFailed(
-        PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_UNKNOWN);
+    plugin_vm_installer_->OnDownloadFailed(
+        PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_UNKNOWN);
   }
 }
 
@@ -217,13 +216,12 @@
   if (ErrorCodeIndicatesFailure(error_code)) {
     LOG(ERROR) << "PluginVM image download from Drive failed with error code: "
                << (int)error_code;
-    plugin_vm_image_manager_->OnDownloadFailed(
-        ConvertToFailureReason(error_code));
+    plugin_vm_installer_->OnDownloadFailed(ConvertToFailureReason(error_code));
     return;
   }
 
   // We only need .path, .hash256, and .bytes_downloaded as the other fields are
-  // not used by PluginVmImageManager::OnDownloadCompleted.
+  // not used by PluginVmInstaller::OnDownloadCompleted.
   download::CompletionInfo completion_info;
   completion_info.path = download_file_path_;
   completion_info.bytes_downloaded = total_bytes_downloaded_;
@@ -231,7 +229,7 @@
   secure_hash_service_->Finish(sha256_hash.data(), sha256_hash.size());
   completion_info.hash256 =
       base::HexEncode(sha256_hash.data(), sha256_hash.size());
-  plugin_vm_image_manager_->OnDownloadCompleted(completion_info);
+  plugin_vm_installer_->OnDownloadCompleted(completion_info);
 }
 
 void PluginVmDriveImageDownloadService::GetContentCallback(
@@ -239,8 +237,7 @@
     std::unique_ptr<std::string> content) {
   if (ErrorCodeIndicatesFailure(error_code)) {
     LOG(ERROR) << "Download failed with error code: " << (int)error_code;
-    plugin_vm_image_manager_->OnDownloadFailed(
-        ConvertToFailureReason(error_code));
+    plugin_vm_installer_->OnDownloadFailed(ConvertToFailureReason(error_code));
     return;
   }
   secure_hash_service_->Update(content->c_str(), content->length());
@@ -249,7 +246,7 @@
 
 void PluginVmDriveImageDownloadService::ProgressCallback(int64_t progress,
                                                          int64_t total) {
-  plugin_vm_image_manager_->OnDownloadProgressUpdated(progress, total);
+  plugin_vm_installer_->OnDownloadProgressUpdated(progress, total);
 }
 
 }  // namespace plugin_vm
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.h
index 88aadad..80ef9bf 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.h
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.h
@@ -15,7 +15,7 @@
 #include "base/callback_forward.h"
 #include "base/files/file_util.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h"
 #include "crypto/secure_hash.h"
 #include "google_apis/drive/drive_api_error_codes.h"
 #include "google_apis/drive/drive_common_callbacks.h"
@@ -38,12 +38,11 @@
  public:
   using OnDownloadStartedCallback = base::OnceCallback<void()>;
   using OnDownloadFailedCallback =
-      base::OnceCallback<void(PluginVmImageManager::FailureReason)>;
+      base::OnceCallback<void(PluginVmInstaller::FailureReason)>;
   using OnFileDeletedCallback = base::OnceCallback<void(bool)>;
 
-  PluginVmDriveImageDownloadService(
-      PluginVmImageManager* plugin_vm_image_manager,
-      Profile* profile);
+  PluginVmDriveImageDownloadService(PluginVmInstaller* plugin_vm_installer,
+                                    Profile* profile);
   PluginVmDriveImageDownloadService(const PluginVmDriveImageDownloadService&) =
       delete;
   PluginVmDriveImageDownloadService& operator=(
@@ -73,7 +72,7 @@
                           std::unique_ptr<std::string> content);
   void ProgressCallback(int64_t progress, int64_t total);
 
-  PluginVmImageManager* plugin_vm_image_manager_;
+  PluginVmInstaller* plugin_vm_installer_;
   std::unique_ptr<drive::DriveServiceInterface> drive_service_;
   std::unique_ptr<crypto::SecureHash> secure_hash_service_;
   std::string file_id_;
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc
index af8bc954..d0a247c 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc
@@ -6,8 +6,8 @@
 
 #include "base/bind.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h"
 #include "chrome/browser/download/download_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_key.h"
@@ -21,8 +21,8 @@
     : profile_(profile) {}
 PluginVmImageDownloadClient::~PluginVmImageDownloadClient() = default;
 
-PluginVmImageManager* PluginVmImageDownloadClient::GetManager() {
-  return PluginVmImageManagerFactory::GetForProfile(profile_);
+PluginVmInstaller* PluginVmImageDownloadClient::GetInstaller() {
+  return PluginVmInstallerFactory::GetForProfile(profile_);
 }
 
 // TODO(okalitova): Remove logs.
@@ -58,7 +58,7 @@
   }
 
   content_length_ = headers ? headers->GetContentLength() : -1;
-  GetManager()->OnDownloadStarted();
+  GetInstaller()->OnDownloadStarted();
 }
 
 void PluginVmImageDownloadClient::OnDownloadUpdated(const std::string& guid,
@@ -67,7 +67,7 @@
   DCHECK(old_downloads_.find(guid) == old_downloads_.end());
   VLOG(1) << __func__ << " called";
   VLOG(1) << bytes_downloaded << " bytes downloaded";
-  GetManager()->OnDownloadProgressUpdated(bytes_downloaded, content_length_);
+  GetInstaller()->OnDownloadProgressUpdated(bytes_downloaded, content_length_);
 }
 
 void PluginVmImageDownloadClient::OnDownloadFailed(
@@ -75,13 +75,12 @@
     const download::CompletionInfo& completion_info,
     download::Client::FailureReason clientReason) {
   VLOG(1) << __func__ << " called";
-  auto managerReason =
-      PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_UNKNOWN;
+  auto failureReason =
+      PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_UNKNOWN;
   switch (clientReason) {
     case download::Client::FailureReason::NETWORK:
       VLOG(1) << "Failure reason: NETWORK";
-      managerReason =
-          PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_NETWORK;
+      failureReason = PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_NETWORK;
       break;
     case download::Client::FailureReason::UPLOAD_TIMEDOUT:
       VLOG(1) << "Failure reason: UPLOAD_TIMEDOUT";
@@ -94,23 +93,22 @@
       break;
     case download::Client::FailureReason::ABORTED:
       VLOG(1) << "Failure reason: ABORTED";
-      managerReason =
-          PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_ABORTED;
+      failureReason = PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_ABORTED;
       break;
     case download::Client::FailureReason::CANCELLED:
       VLOG(1) << "Failure reason: CANCELLED";
       break;
   }
 
-  // We do not want to notify PluginVmImageManager about the status of
-  // downloads that are tracked by download service from its initialization.
+  // We do not want to notify PluginVmInstaller about the status of downloads
+  // that are tracked by download service from its initialization.
   if (old_downloads_.find(guid) != old_downloads_.end())
     return;
 
   if (clientReason == download::Client::FailureReason::CANCELLED)
-    GetManager()->OnDownloadCancelled();
+    GetInstaller()->OnDownloadCancelled();
   else
-    GetManager()->OnDownloadFailed(managerReason);
+    GetInstaller()->OnDownloadFailed(failureReason);
 }
 
 void PluginVmImageDownloadClient::OnDownloadSucceeded(
@@ -119,7 +117,7 @@
   DCHECK(old_downloads_.find(guid) == old_downloads_.end());
   VLOG(1) << __func__ << " called";
   VLOG(1) << "Downloaded file is in " << completion_info.path.value();
-  GetManager()->OnDownloadCompleted(completion_info);
+  GetInstaller()->OnDownloadCompleted(completion_info);
 }
 
 bool PluginVmImageDownloadClient::CanServiceRemoveDownloadedFile(
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h
index 5b1f6f86..253cede 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h
@@ -20,7 +20,7 @@
 
 namespace plugin_vm {
 
-class PluginVmImageManager;
+class PluginVmInstaller;
 
 class PluginVmImageDownloadClient : public download::Client {
  public:
@@ -32,7 +32,7 @@
   Profile* profile_ = nullptr;
   int64_t content_length_ = -1;
 
-  PluginVmImageManager* GetManager();
+  PluginVmInstaller* GetInstaller();
 
   // download::Client implementation.
   void OnServiceInitialized(
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.cc
deleted file mode 100644
index cb42325..0000000
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h"
-
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
-#include "chrome/browser/download/download_service_factory.h"
-#include "chrome/browser/profiles/incognito_helpers.h"
-#include "chrome/browser/profiles/profile.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-
-namespace plugin_vm {
-
-// static
-PluginVmImageManager* PluginVmImageManagerFactory::GetForProfile(
-    Profile* profile) {
-  return static_cast<PluginVmImageManager*>(
-      GetInstance()->GetServiceForBrowserContext(profile, true));
-}
-
-// static
-PluginVmImageManagerFactory* PluginVmImageManagerFactory::GetInstance() {
-  return base::Singleton<PluginVmImageManagerFactory>::get();
-}
-
-PluginVmImageManagerFactory::PluginVmImageManagerFactory()
-    : BrowserContextKeyedServiceFactory(
-          "PluginVmImageManager",
-          BrowserContextDependencyManager::GetInstance()) {
-  DependsOn(DownloadServiceFactory::GetInstance());
-}
-
-PluginVmImageManagerFactory::~PluginVmImageManagerFactory() = default;
-
-KeyedService* PluginVmImageManagerFactory::BuildServiceInstanceFor(
-    content::BrowserContext* context) const {
-  return new PluginVmImageManager(Profile::FromBrowserContext(context));
-}
-
-content::BrowserContext* PluginVmImageManagerFactory::GetBrowserContextToUse(
-    content::BrowserContext* context) const {
-  return chrome::GetBrowserContextRedirectedInIncognito(context);
-}
-
-}  // namespace plugin_vm
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h
deleted file mode 100644
index ad4879f..0000000
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_IMAGE_MANAGER_FACTORY_H_
-#define CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_IMAGE_MANAGER_FACTORY_H_
-
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-
-namespace content {
-class BrowserContext;
-}  // namespace content
-
-class Profile;
-
-namespace plugin_vm {
-
-class PluginVmImageManager;
-
-class PluginVmImageManagerFactory : public BrowserContextKeyedServiceFactory {
- public:
-  static PluginVmImageManager* GetForProfile(Profile* profile);
-  static PluginVmImageManagerFactory* GetInstance();
-
- private:
-  friend struct base::DefaultSingletonTraits<PluginVmImageManagerFactory>;
-
-  PluginVmImageManagerFactory();
-  ~PluginVmImageManagerFactory() override;
-
-  // BrowserContextKeyedServiceFactory implementation.
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override;
-  content::BrowserContext* GetBrowserContextToUse(
-      content::BrowserContext* context) const override;
-
-  DISALLOW_COPY_AND_ASSIGN(PluginVmImageManagerFactory);
-};
-
-}  // namespace plugin_vm
-
-#endif  // CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_IMAGE_MANAGER_FACTORY_H_
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc
similarity index 84%
rename from chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.cc
rename to chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc
index 67682353..f5c1d31b 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h"
 
 #include <memory>
 #include <string>
@@ -45,13 +45,13 @@
 
 namespace plugin_vm {
 
-PluginVmImageManager::~PluginVmImageManager() = default;
+PluginVmInstaller::~PluginVmInstaller() = default;
 
-bool PluginVmImageManager::IsProcessing() {
+bool PluginVmInstaller::IsProcessing() {
   return State::NOT_STARTED < state_ && state_ < State::CONFIGURED;
 }
 
-void PluginVmImageManager::StartDlcDownload() {
+void PluginVmInstaller::StartDlcDownload() {
   if (IsProcessing()) {
     LOG(ERROR) << "Download of a PluginVm image couldn't be started as"
                << " another PluginVm image is currently being processed "
@@ -76,9 +76,9 @@
   if (prev_state != State::DOWNLOAD_DLC_CANCELLED) {
     chromeos::DlcserviceClient::Get()->Install(
         dlc_module_list_,
-        base::BindOnce(&PluginVmImageManager::OnDlcDownloadCompleted,
+        base::BindOnce(&PluginVmInstaller::OnDlcDownloadCompleted,
                        weak_ptr_factory_.GetWeakPtr()),
-        base::BindRepeating(&PluginVmImageManager::OnDlcDownloadProgressUpdated,
+        base::BindRepeating(&PluginVmInstaller::OnDlcDownloadProgressUpdated,
                             weak_ptr_factory_.GetWeakPtr()));
   }
 
@@ -86,14 +86,14 @@
     observer_->OnDlcDownloadStarted();
 }
 
-void PluginVmImageManager::CancelDlcDownload() {
+void PluginVmInstaller::CancelDlcDownload() {
   state_ = State::DOWNLOAD_DLC_CANCELLED;
 
   if (observer_)
     observer_->OnDlcDownloadCancelled();
 }
 
-void PluginVmImageManager::StartDownload() {
+void PluginVmInstaller::StartDownload() {
   if (state_ != State::DOWNLOADED_DLC) {
     LOG(ERROR) << "Download of a PluginVm image couldn't be started as "
                << "StartDlcDownload() was not called prior.";
@@ -124,7 +124,7 @@
   }
 }
 
-void PluginVmImageManager::CancelDownload() {
+void PluginVmInstaller::CancelDownload() {
   state_ = State::DOWNLOAD_CANCELLED;
 
   if (using_drive_download_service_) {
@@ -135,7 +135,7 @@
   }
 }
 
-void PluginVmImageManager::OnDlcDownloadProgressUpdated(double progress) {
+void PluginVmInstaller::OnDlcDownloadProgressUpdated(double progress) {
   if (state_ != State::DOWNLOADING_DLC)
     return;
 
@@ -144,7 +144,7 @@
         progress, base::TimeTicks::Now() - dlc_download_start_tick_);
 }
 
-void PluginVmImageManager::OnDlcDownloadCompleted(
+void PluginVmInstaller::OnDlcDownloadCompleted(
     const std::string& err,
     const dlcservice::DlcModuleList& dlc_module_list) {
   if (state_ != State::DOWNLOADING_DLC)
@@ -164,14 +164,14 @@
     observer_->OnDlcDownloadCompleted();
 }
 
-void PluginVmImageManager::OnDownloadStarted() {
+void PluginVmInstaller::OnDownloadStarted() {
   download_start_tick_ = base::TimeTicks::Now();
   if (observer_)
     observer_->OnDownloadStarted();
 }
 
-void PluginVmImageManager::OnDownloadProgressUpdated(uint64_t bytes_downloaded,
-                                                     int64_t content_length) {
+void PluginVmInstaller::OnDownloadProgressUpdated(uint64_t bytes_downloaded,
+                                                  int64_t content_length) {
   if (observer_) {
     observer_->OnDownloadProgressUpdated(
         bytes_downloaded, content_length,
@@ -179,7 +179,7 @@
   }
 }
 
-void PluginVmImageManager::OnDownloadCompleted(
+void PluginVmInstaller::OnDownloadCompleted(
     const download::CompletionInfo& info) {
   downloaded_plugin_vm_image_archive_ = info.path;
   downloaded_plugin_vm_image_size_ = info.bytes_downloaded;
@@ -198,7 +198,7 @@
   RecordPluginVmImageDownloadedSizeHistogram(info.bytes_downloaded);
 }
 
-void PluginVmImageManager::OnDownloadCancelled() {
+void PluginVmInstaller::OnDownloadCancelled() {
   DCHECK_EQ(state_, State::DOWNLOAD_CANCELLED);
 
   RemoveTemporaryPluginVmImageArchiveIfExists();
@@ -213,7 +213,7 @@
   state_ = State::NOT_STARTED;
 }
 
-void PluginVmImageManager::OnDownloadFailed(FailureReason reason) {
+void PluginVmInstaller::OnDownloadFailed(FailureReason reason) {
   state_ = State::DOWNLOAD_FAILED;
   RemoveTemporaryPluginVmImageArchiveIfExists();
   current_download_guid_.clear();
@@ -227,7 +227,7 @@
     observer_->OnDownloadFailed(reason);
 }
 
-void PluginVmImageManager::StartImport() {
+void PluginVmInstaller::StartImport() {
   if (state_ != State::DOWNLOADED) {
     LOG(ERROR) << "Importing of PluginVm image couldn't proceed as current "
                << "state is " << GetStateName(state_) << " not "
@@ -243,22 +243,22 @@
       ->GetDebugDaemonClient()
       ->StartPluginVmDispatcher(
           chromeos::ProfileHelper::GetUserIdHashFromProfile(profile_),
-          base::BindOnce(&PluginVmImageManager::OnPluginVmDispatcherStarted,
+          base::BindOnce(&PluginVmInstaller::OnPluginVmDispatcherStarted,
                          weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PluginVmImageManager::OnPluginVmDispatcherStarted(bool success) {
+void PluginVmInstaller::OnPluginVmDispatcherStarted(bool success) {
   if (!success) {
     LOG(ERROR) << "Failed to start PluginVm dispatcher service";
     OnImported(FailureReason::DISPATCHER_NOT_AVAILABLE);
     return;
   }
   GetConciergeClient()->WaitForServiceToBeAvailable(
-      base::BindOnce(&PluginVmImageManager::OnConciergeAvailable,
+      base::BindOnce(&PluginVmInstaller::OnConciergeAvailable,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PluginVmImageManager::OnConciergeAvailable(bool success) {
+void PluginVmInstaller::OnConciergeAvailable(bool success) {
   if (!success) {
     LOG(ERROR) << "Concierge did not become available";
     OnImported(FailureReason::CONCIERGE_NOT_AVAILABLE);
@@ -276,12 +276,12 @@
   base::PostTaskAndReplyWithResult(
       FROM_HERE,
       {base::ThreadPool(), base::TaskPriority::USER_VISIBLE, base::MayBlock()},
-      base::BindOnce(&PluginVmImageManager::PrepareFD, base::Unretained(this)),
-      base::BindOnce(&PluginVmImageManager::OnFDPrepared,
+      base::BindOnce(&PluginVmInstaller::PrepareFD, base::Unretained(this)),
+      base::BindOnce(&PluginVmInstaller::OnFDPrepared,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-base::Optional<base::ScopedFD> PluginVmImageManager::PrepareFD() {
+base::Optional<base::ScopedFD> PluginVmInstaller::PrepareFD() {
   // In case import has been cancelled meantime.
   if (state_ == State::IMPORT_CANCELLED || state_ == State::NOT_STARTED)
     return base::nullopt;
@@ -297,8 +297,7 @@
   return fd;
 }
 
-void PluginVmImageManager::OnFDPrepared(
-    base::Optional<base::ScopedFD> maybeFd) {
+void PluginVmInstaller::OnFDPrepared(base::Optional<base::ScopedFD> maybeFd) {
   // In case import has been cancelled meantime.
   if (state_ == State::IMPORT_CANCELLED || state_ == State::NOT_STARTED)
     return;
@@ -321,11 +320,11 @@
 
   GetConciergeClient()->ImportDiskImage(
       std::move(maybeFd.value()), request,
-      base::BindOnce(&PluginVmImageManager::OnImportDiskImage,
+      base::BindOnce(&PluginVmInstaller::OnImportDiskImage,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PluginVmImageManager::OnImportDiskImage(
+void PluginVmInstaller::OnImportDiskImage(
     base::Optional<vm_tools::concierge::ImportDiskImageResponse> reply) {
   if (!reply.has_value()) {
     LOG(ERROR) << "Could not retrieve response from ImportDiskImage call to "
@@ -359,7 +358,7 @@
   //   at this stage though.
 }
 
-void PluginVmImageManager::OnDiskImageProgress(
+void PluginVmInstaller::OnDiskImageProgress(
     const vm_tools::concierge::DiskImageStatusResponse& signal) {
   if (signal.command_uuid() != current_import_command_uuid_)
     return;
@@ -387,16 +386,15 @@
   }
 }
 
-void PluginVmImageManager::RequestFinalStatus() {
+void PluginVmInstaller::RequestFinalStatus() {
   vm_tools::concierge::DiskImageStatusRequest status_request;
   status_request.set_command_uuid(current_import_command_uuid_);
   GetConciergeClient()->DiskImageStatus(
-      status_request,
-      base::BindOnce(&PluginVmImageManager::OnFinalDiskImageStatus,
-                     weak_ptr_factory_.GetWeakPtr()));
+      status_request, base::BindOnce(&PluginVmInstaller::OnFinalDiskImageStatus,
+                                     weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PluginVmImageManager::OnFinalDiskImageStatus(
+void PluginVmInstaller::OnFinalDiskImageStatus(
     base::Optional<vm_tools::concierge::DiskImageStatusResponse> reply) {
   if (!reply.has_value()) {
     LOG(ERROR) << "Could not retrieve response from DiskImageStatus call to "
@@ -418,7 +416,7 @@
   OnImported(base::nullopt);
 }
 
-void PluginVmImageManager::OnImported(
+void PluginVmInstaller::OnImported(
     base::Optional<FailureReason> failure_reason) {
   GetConciergeClient()->RemoveDiskImageObserver(this);
   RemoveTemporaryPluginVmImageArchiveIfExists();
@@ -442,7 +440,7 @@
   state_ = State::CONFIGURED;
 }
 
-void PluginVmImageManager::CancelImport() {
+void PluginVmInstaller::CancelImport() {
   state_ = State::IMPORT_CANCELLED;
   VLOG(1) << "Cancelling disk image import with command_uuid: "
           << current_import_command_uuid_;
@@ -450,11 +448,11 @@
   vm_tools::concierge::CancelDiskImageRequest request;
   request.set_command_uuid(current_import_command_uuid_);
   GetConciergeClient()->CancelDiskImageOperation(
-      request, base::BindOnce(&PluginVmImageManager::OnImportDiskImageCancelled,
+      request, base::BindOnce(&PluginVmInstaller::OnImportDiskImageCancelled,
                               weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PluginVmImageManager::OnImportDiskImageCancelled(
+void PluginVmInstaller::OnImportDiskImageCancelled(
     base::Optional<vm_tools::concierge::CancelDiskImageResponse> reply) {
   DCHECK_EQ(state_, State::IMPORT_CANCELLED);
 
@@ -481,34 +479,34 @@
   VLOG(1) << "Import disk image request has been cancelled successfully";
 }
 
-void PluginVmImageManager::SetObserver(Observer* observer) {
+void PluginVmInstaller::SetObserver(Observer* observer) {
   observer_ = observer;
 }
 
-void PluginVmImageManager::RemoveObserver() {
+void PluginVmInstaller::RemoveObserver() {
   observer_ = nullptr;
 }
 
-void PluginVmImageManager::SetDownloadServiceForTesting(
+void PluginVmInstaller::SetDownloadServiceForTesting(
     download::DownloadService* download_service) {
   download_service_ = download_service;
 }
 
-void PluginVmImageManager::SetDownloadedPluginVmImageArchiveForTesting(
+void PluginVmInstaller::SetDownloadedPluginVmImageArchiveForTesting(
     const base::FilePath& downloaded_plugin_vm_image_archive) {
   downloaded_plugin_vm_image_archive_ = downloaded_plugin_vm_image_archive;
 }
 
-std::string PluginVmImageManager::GetCurrentDownloadGuidForTesting() {
+std::string PluginVmInstaller::GetCurrentDownloadGuidForTesting() {
   return current_download_guid_;
 }
 
-void PluginVmImageManager::SetDriveDownloadServiceForTesting(
+void PluginVmInstaller::SetDriveDownloadServiceForTesting(
     std::unique_ptr<PluginVmDriveImageDownloadService> drive_download_service) {
   drive_download_service_ = std::move(drive_download_service);
 }
 
-PluginVmImageManager::PluginVmImageManager(Profile* profile)
+PluginVmInstaller::PluginVmInstaller(Profile* profile)
     : profile_(profile),
       download_service_(
           DownloadServiceFactory::GetForKey(profile->GetProfileKey())) {
@@ -516,7 +514,7 @@
   dlc_module_info->set_dlc_id(kPitaDlc);
 }
 
-GURL PluginVmImageManager::GetPluginVmImageDownloadUrl() {
+GURL PluginVmInstaller::GetPluginVmImageDownloadUrl() {
   const base::Value* url_ptr =
       profile_->GetPrefs()
           ->GetDictionary(plugin_vm::prefs::kPluginVmImage)
@@ -528,7 +526,7 @@
   return GURL(url_ptr->GetString());
 }
 
-std::string PluginVmImageManager::GetStateName(State state) {
+std::string PluginVmInstaller::GetStateName(State state) {
   switch (state) {
     case State::NOT_STARTED:
       return "NOT_STARTED";
@@ -559,14 +557,13 @@
   }
 }
 
-download::DownloadParams PluginVmImageManager::GetDownloadParams(
-    const GURL& url) {
+download::DownloadParams PluginVmInstaller::GetDownloadParams(const GURL& url) {
   download::DownloadParams params;
 
   // DownloadParams
   params.client = download::DownloadClient::PLUGIN_VM_IMAGE;
   params.guid = base::GenerateGUID();
-  params.callback = base::BindRepeating(&PluginVmImageManager::OnStartDownload,
+  params.callback = base::BindRepeating(&PluginVmInstaller::OnStartDownload,
                                         weak_ptr_factory_.GetWeakPtr());
 
   params.traffic_annotation = net::MutableNetworkTrafficAnnotationTag(
@@ -588,7 +585,7 @@
   return params;
 }
 
-void PluginVmImageManager::OnStartDownload(
+void PluginVmInstaller::OnStartDownload(
     const std::string& download_guid,
     download::DownloadParams::StartResult start_result) {
   if (start_result == download::DownloadParams::ACCEPTED)
@@ -597,7 +594,7 @@
     OnDownloadFailed(FailureReason::DOWNLOAD_FAILED_UNKNOWN);
 }
 
-bool PluginVmImageManager::VerifyDownload(
+bool PluginVmInstaller::VerifyDownload(
     const std::string& downloaded_archive_hash) {
   if (downloaded_archive_hash.empty()) {
     LOG(ERROR) << "No hash found for downloaded PluginVm image archive";
@@ -617,10 +614,10 @@
                                           downloaded_archive_hash);
 }
 
-void PluginVmImageManager::RemoveTemporaryPluginVmImageArchiveIfExists() {
+void PluginVmInstaller::RemoveTemporaryPluginVmImageArchiveIfExists() {
   if (using_drive_download_service_) {
     drive_download_service_->RemoveTemporaryArchive(base::BindOnce(
-        &PluginVmImageManager::OnTemporaryPluginVmImageArchiveRemoved,
+        &PluginVmInstaller::OnTemporaryPluginVmImageArchiveRemoved,
         weak_ptr_factory_.GetWeakPtr()));
   } else {
     if (!downloaded_plugin_vm_image_archive_.empty()) {
@@ -631,14 +628,13 @@
           base::BindOnce(&base::DeleteFile, downloaded_plugin_vm_image_archive_,
                          false /* recursive */),
           base::BindOnce(
-              &PluginVmImageManager::OnTemporaryPluginVmImageArchiveRemoved,
+              &PluginVmInstaller::OnTemporaryPluginVmImageArchiveRemoved,
               weak_ptr_factory_.GetWeakPtr()));
     }
   }
 }
 
-void PluginVmImageManager::OnTemporaryPluginVmImageArchiveRemoved(
-    bool success) {
+void PluginVmInstaller::OnTemporaryPluginVmImageArchiveRemoved(bool success) {
   if (!success) {
     LOG(ERROR) << "Downloaded PluginVm image archive located in "
                << downloaded_plugin_vm_image_archive_.value()
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h
similarity index 91%
rename from chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h
rename to chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h
index 8767cc85..e2c4c014 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_IMAGE_MANAGER_H_
-#define CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_IMAGE_MANAGER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_INSTALLER_H_
+#define CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_INSTALLER_H_
 
 #include <memory>
 #include <string>
@@ -28,7 +28,7 @@
 
 class PluginVmDriveImageDownloadService;
 
-// PluginVmImageManager is responsible for management of PluginVm image
+// PluginVmInstaller is responsible for installing the PluginVm image,
 // including downloading this image from url specified by the user policy,
 // and importing the downloaded image archive using concierge D-Bus services.
 //
@@ -37,16 +37,15 @@
 // called in this order. Image processing might be interrupted by
 // calling the corresponding cancel methods. If one of the methods mentioned is
 // called not in the correct order or before the previous state is finished then
-// associated fail method will be called by the manager and image processing
+// associated fail method will be called by the installer and image processing
 // will be interrupted.
 //
 // This class uses one of two different objects for handling file downloads. If
 // the image is hosted on Drive, a PluginVmDriveImageDownloadService object is
 // used due to the need for using the Drive API. In all other cases, the
 // DownloadService class is used to make the request directly.
-class PluginVmImageManager
-    : public KeyedService,
-      public chromeos::ConciergeClient::DiskImageObserver {
+class PluginVmInstaller : public KeyedService,
+                          public chromeos::ConciergeClient::DiskImageObserver {
  public:
   // FailureReasons values can be shown to the user. Do not reorder or renumber
   // these values without careful consideration.
@@ -94,9 +93,9 @@
     virtual void OnImportFailed(FailureReason reason) = 0;
   };
 
-  explicit PluginVmImageManager(Profile* profile);
+  explicit PluginVmInstaller(Profile* profile);
 
-  // Returns true if manager is processing PluginVm image at the moment.
+  // Returns true if installer is processing a PluginVm image at the moment.
   bool IsProcessing();
 
   // Initiates the PluginVM DLC download, should always be called before
@@ -189,7 +188,7 @@
   std::unique_ptr<PluginVmDriveImageDownloadService> drive_download_service_;
   bool using_drive_download_service_ = false;
 
-  ~PluginVmImageManager() override;
+  ~PluginVmInstaller() override;
 
   // Get string representation of state for logging purposes.
   std::string GetStateName(State state);
@@ -225,7 +224,7 @@
 
   // Callback for the final call to concierge's DiskImageStatus to
   // get the final result of the disk import operation. This moves
-  // the manager to a finishing state, depending on the result of the
+  // the installer to a finishing state, depending on the result of the
   // query. Called when the signal for the command indicates that we
   // are done with importing.
   void OnFinalDiskImageStatus(
@@ -242,11 +241,11 @@
   void RemoveTemporaryPluginVmImageArchiveIfExists();
   void OnTemporaryPluginVmImageArchiveRemoved(bool success);
 
-  base::WeakPtrFactory<PluginVmImageManager> weak_ptr_factory_{this};
+  base::WeakPtrFactory<PluginVmInstaller> weak_ptr_factory_{this};
 
-  DISALLOW_COPY_AND_ASSIGN(PluginVmImageManager);
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstaller);
 };
 
 }  // namespace plugin_vm
 
-#endif  // CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_IMAGE_MANAGER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_INSTALLER_H_
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.cc
new file mode 100644
index 0000000..a8f4410c0
--- /dev/null
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.cc
@@ -0,0 +1,45 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h"
+
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h"
+#include "chrome/browser/download/download_service_factory.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace plugin_vm {
+
+// static
+PluginVmInstaller* PluginVmInstallerFactory::GetForProfile(Profile* profile) {
+  return static_cast<PluginVmInstaller*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+// static
+PluginVmInstallerFactory* PluginVmInstallerFactory::GetInstance() {
+  return base::Singleton<PluginVmInstallerFactory>::get();
+}
+
+PluginVmInstallerFactory::PluginVmInstallerFactory()
+    : BrowserContextKeyedServiceFactory(
+          "PluginVmInstaller",
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(DownloadServiceFactory::GetInstance());
+}
+
+PluginVmInstallerFactory::~PluginVmInstallerFactory() = default;
+
+KeyedService* PluginVmInstallerFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  return new PluginVmInstaller(Profile::FromBrowserContext(context));
+}
+
+content::BrowserContext* PluginVmInstallerFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  return chrome::GetBrowserContextRedirectedInIncognito(context);
+}
+
+}  // namespace plugin_vm
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h
new file mode 100644
index 0000000..7819707
--- /dev/null
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_INSTALLER_FACTORY_H_
+#define CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_INSTALLER_FACTORY_H_
+
+#include "base/macros.h"
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+class Profile;
+
+namespace plugin_vm {
+
+class PluginVmInstaller;
+
+class PluginVmInstallerFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static PluginVmInstaller* GetForProfile(Profile* profile);
+  static PluginVmInstallerFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<PluginVmInstallerFactory>;
+
+  PluginVmInstallerFactory();
+  ~PluginVmInstallerFactory() override;
+
+  // BrowserContextKeyedServiceFactory implementation.
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstallerFactory);
+};
+
+}  // namespace plugin_vm
+
+#endif  // CHROME_BROWSER_CHROMEOS_PLUGIN_VM_PLUGIN_VM_INSTALLER_FACTORY_H_
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_unittest.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc
similarity index 77%
rename from chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_unittest.cc
rename to chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc
index 40190b09..3d17fc6 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_unittest.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h"
 
 #include <stdint.h>
 #include <string.h>
@@ -18,7 +18,7 @@
 #include "chrome/browser/chromeos/login/users/mock_user_manager.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_metrics_util.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h"
@@ -67,7 +67,7 @@
 
 }  // namespace
 
-class MockObserver : public PluginVmImageManager::Observer {
+class MockObserver : public PluginVmInstaller::Observer {
  public:
   MOCK_METHOD0(OnDlcDownloadStarted, void());
   MOCK_METHOD2(OnDlcDownloadProgressUpdated,
@@ -75,7 +75,7 @@
   MOCK_METHOD0(OnDlcDownloadCompleted, void());
   MOCK_METHOD0(OnDlcDownloadCancelled, void());
   MOCK_METHOD1(OnDlcDownloadFailed,
-               void(plugin_vm::PluginVmImageManager::FailureReason));
+               void(plugin_vm::PluginVmInstaller::FailureReason));
   MOCK_METHOD0(OnDownloadStarted, void());
   MOCK_METHOD3(OnDownloadProgressUpdated,
                void(uint64_t bytes_downloaded,
@@ -84,13 +84,13 @@
   MOCK_METHOD0(OnDownloadCompleted, void());
   MOCK_METHOD0(OnDownloadCancelled, void());
   MOCK_METHOD1(OnDownloadFailed,
-               void(plugin_vm::PluginVmImageManager::FailureReason));
+               void(plugin_vm::PluginVmInstaller::FailureReason));
   MOCK_METHOD2(OnImportProgressUpdated,
                void(int percent_completed, base::TimeDelta elapsed_time));
   MOCK_METHOD0(OnImported, void());
   MOCK_METHOD0(OnImportCancelled, void());
   MOCK_METHOD1(OnImportFailed,
-               void(plugin_vm::PluginVmImageManager::FailureReason));
+               void(plugin_vm::PluginVmInstaller::FailureReason));
 };
 
 // We are inheriting from DummyDriveService instead of DriveServiceInterface
@@ -145,10 +145,10 @@
   ProgressCallback progress_callback_;
 };
 
-class PluginVmImageManagerTestBase : public testing::Test {
+class PluginVmInstallerTestBase : public testing::Test {
  public:
-  PluginVmImageManagerTestBase() = default;
-  ~PluginVmImageManagerTestBase() override = default;
+  PluginVmInstallerTestBase() = default;
+  ~PluginVmInstallerTestBase() override = default;
 
  protected:
   void SetUp() override {
@@ -162,9 +162,9 @@
     // Sets new PluginVmImage pref for this test.
     SetPluginVmImagePref(kUrl, kHash);
 
-    manager_ = PluginVmImageManagerFactory::GetForProfile(profile_.get());
+    installer_ = PluginVmInstallerFactory::GetForProfile(profile_.get());
     observer_ = std::make_unique<MockObserver>();
-    manager_->SetObserver(observer_.get());
+    installer_->SetObserver(observer_.get());
 
     fake_concierge_client_ = static_cast<chromeos::FakeConciergeClient*>(
         chromeos::DBusThreadManager::Get()->GetConciergeClient());
@@ -193,9 +193,9 @@
   }
 
   void ProcessImageUntilImporting() {
-    manager_->StartDlcDownload();
+    installer_->StartDlcDownload();
     task_environment_.RunUntilIdle();
-    manager_->StartDownload();
+    installer_->StartDownload();
     task_environment_.RunUntilIdle();
   }
 
@@ -203,16 +203,16 @@
     ProcessImageUntilImporting();
 
     // Faking downloaded file for testing.
-    manager_->SetDownloadedPluginVmImageArchiveForTesting(
+    installer_->SetDownloadedPluginVmImageArchiveForTesting(
         fake_downloaded_plugin_vm_image_archive_);
-    manager_->StartImport();
+    installer_->StartImport();
     task_environment_.RunUntilIdle();
   }
 
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<TestingProfile> profile_;
   std::unique_ptr<PluginVmTestHelper> plugin_vm_test_helper_;
-  PluginVmImageManager* manager_;
+  PluginVmInstaller* installer_;
   std::unique_ptr<MockObserver> observer_;
   base::FilePath fake_downloaded_plugin_vm_image_archive_;
   // Owned by chromeos::DBusThreadManager
@@ -233,31 +233,30 @@
 
   base::ScopedTempDir profiles_dir_;
 
-  DISALLOW_COPY_AND_ASSIGN(PluginVmImageManagerTestBase);
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstallerTestBase);
 };
 
-class PluginVmImageManagerDownloadServiceTest
-    : public PluginVmImageManagerTestBase {
+class PluginVmInstallerDownloadServiceTest : public PluginVmInstallerTestBase {
  public:
-  PluginVmImageManagerDownloadServiceTest() = default;
-  ~PluginVmImageManagerDownloadServiceTest() override = default;
+  PluginVmInstallerDownloadServiceTest() = default;
+  ~PluginVmInstallerDownloadServiceTest() override = default;
 
  protected:
   void SetUp() override {
-    PluginVmImageManagerTestBase::SetUp();
+    PluginVmInstallerTestBase::SetUp();
 
     download_service_ = std::make_unique<download::test::TestDownloadService>();
     download_service_->SetIsReady(true);
     download_service_->SetHash256(kHash);
     client_ = std::make_unique<PluginVmImageDownloadClient>(profile_.get());
     download_service_->set_client(client_.get());
-    manager_->SetDownloadServiceForTesting(download_service_.get());
+    installer_->SetDownloadServiceForTesting(download_service_.get());
     histogram_tester_ = std::make_unique<base::HistogramTester>();
     fake_downloaded_plugin_vm_image_archive_ = CreateZipFile();
   }
 
   void TearDown() override {
-    PluginVmImageManagerTestBase::TearDown();
+    PluginVmInstallerTestBase::TearDown();
 
     histogram_tester_.reset();
     download_service_.reset();
@@ -276,17 +275,17 @@
 
  private:
   std::unique_ptr<PluginVmImageDownloadClient> client_;
-  DISALLOW_COPY_AND_ASSIGN(PluginVmImageManagerDownloadServiceTest);
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstallerDownloadServiceTest);
 };
 
-class PluginVmImageManagerDriveTest : public PluginVmImageManagerTestBase {
+class PluginVmInstallerDriveTest : public PluginVmInstallerTestBase {
  public:
-  PluginVmImageManagerDriveTest() = default;
-  ~PluginVmImageManagerDriveTest() override = default;
+  PluginVmInstallerDriveTest() = default;
+  ~PluginVmInstallerDriveTest() override = default;
 
  protected:
   void SetUp() override {
-    PluginVmImageManagerTestBase::SetUp();
+    PluginVmInstallerTestBase::SetUp();
 
     google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR;
     std::unique_ptr<google_apis::FileResource> entry;
@@ -304,7 +303,7 @@
     ASSERT_TRUE(entry);
 
     auto drive_download_service =
-        std::make_unique<PluginVmDriveImageDownloadService>(manager_,
+        std::make_unique<PluginVmDriveImageDownloadService>(installer_,
                                                             profile_.get());
     // We will need to access this object for some tests in the future.
     drive_download_service_ = drive_download_service.get();
@@ -315,7 +314,7 @@
     drive_download_service->SetDriveServiceForTesting(
         std::move(fake_drive_service));
 
-    manager_->SetDriveDownloadServiceForTesting(
+    installer_->SetDriveDownloadServiceForTesting(
         std::move(drive_download_service));
   }
 
@@ -333,11 +332,10 @@
   drive::FakeDriveService* fake_drive_service_;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(PluginVmImageManagerDriveTest);
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstallerDriveTest);
 };
 
-TEST_F(PluginVmImageManagerDownloadServiceTest,
-       DownloadPluginVmImageParamsTest) {
+TEST_F(PluginVmInstallerDownloadServiceTest, DownloadPluginVmImageParamsTest) {
   SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
 
   EXPECT_CALL(*observer_, OnDlcDownloadStarted());
@@ -346,11 +344,11 @@
   EXPECT_CALL(*observer_, OnImportProgressUpdated(50.0, _));
   EXPECT_CALL(*observer_, OnImported());
 
-  manager_->StartDlcDownload();
+  installer_->StartDlcDownload();
   task_environment_.RunUntilIdle();
-  manager_->StartDownload();
+  installer_->StartDownload();
 
-  std::string guid = manager_->GetCurrentDownloadGuidForTesting();
+  std::string guid = installer_->GetCurrentDownloadGuidForTesting();
   base::Optional<download::DownloadParams> params =
       download_service_->GetDownload(guid);
   ASSERT_TRUE(params.has_value());
@@ -361,13 +359,13 @@
   // Finishing image processing.
   task_environment_.RunUntilIdle();
   // Faking downloaded file for testing.
-  manager_->SetDownloadedPluginVmImageArchiveForTesting(
+  installer_->SetDownloadedPluginVmImageArchiveForTesting(
       fake_downloaded_plugin_vm_image_archive_);
-  manager_->StartImport();
+  installer_->StartImport();
   task_environment_.RunUntilIdle();
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest, OnlyOneImageIsProcessedTest) {
+TEST_F(PluginVmInstallerDownloadServiceTest, OnlyOneImageIsProcessedTest) {
   SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
 
   EXPECT_CALL(*observer_, OnDlcDownloadStarted());
@@ -376,32 +374,32 @@
   EXPECT_CALL(*observer_, OnImportProgressUpdated(50.0, _));
   EXPECT_CALL(*observer_, OnImported());
 
-  manager_->StartDlcDownload();
+  installer_->StartDlcDownload();
   task_environment_.RunUntilIdle();
-  manager_->StartDownload();
+  installer_->StartDownload();
 
-  EXPECT_TRUE(manager_->IsProcessing());
+  EXPECT_TRUE(installer_->IsProcessing());
 
   task_environment_.RunUntilIdle();
   // Faking downloaded file for testing.
-  manager_->SetDownloadedPluginVmImageArchiveForTesting(
+  installer_->SetDownloadedPluginVmImageArchiveForTesting(
       fake_downloaded_plugin_vm_image_archive_);
 
-  EXPECT_TRUE(manager_->IsProcessing());
+  EXPECT_TRUE(installer_->IsProcessing());
 
-  manager_->StartImport();
+  installer_->StartImport();
 
-  EXPECT_TRUE(manager_->IsProcessing());
+  EXPECT_TRUE(installer_->IsProcessing());
 
   task_environment_.RunUntilIdle();
 
-  EXPECT_FALSE(manager_->IsProcessing());
+  EXPECT_FALSE(installer_->IsProcessing());
 
   histogram_tester_->ExpectUniqueSample(kPluginVmImageDownloadedSizeHistogram,
                                         kDownloadedPluginVmImageSizeInMb, 1);
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest,
+TEST_F(PluginVmInstallerDownloadServiceTest,
        CanProceedWithANewImageWhenSucceededTest) {
   SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
 
@@ -411,7 +409,7 @@
 
   ProcessImageUntilConfigured();
 
-  EXPECT_FALSE(manager_->IsProcessing());
+  EXPECT_FALSE(installer_->IsProcessing());
 
   // As it is deleted after successful importing.
   fake_downloaded_plugin_vm_image_archive_ = CreateZipFile();
@@ -421,28 +419,27 @@
                                         kDownloadedPluginVmImageSizeInMb, 2);
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest,
+TEST_F(PluginVmInstallerDownloadServiceTest,
        CanProceedWithANewImageWhenFailedTest) {
   SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
 
-  EXPECT_CALL(
-      *observer_,
-      OnDownloadFailed(
-          PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_ABORTED));
+  EXPECT_CALL(*observer_,
+              OnDownloadFailed(
+                  PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_ABORTED));
   EXPECT_CALL(*observer_, OnDlcDownloadStarted()).Times(2);
   EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(2);
   EXPECT_CALL(*observer_, OnDownloadCompleted());
   EXPECT_CALL(*observer_, OnImportProgressUpdated(50.0, _));
   EXPECT_CALL(*observer_, OnImported());
 
-  manager_->StartDlcDownload();
+  installer_->StartDlcDownload();
   task_environment_.RunUntilIdle();
-  manager_->StartDownload();
-  std::string guid = manager_->GetCurrentDownloadGuidForTesting();
+  installer_->StartDownload();
+  std::string guid = installer_->GetCurrentDownloadGuidForTesting();
   download_service_->SetFailedDownload(guid, false);
   task_environment_.RunUntilIdle();
 
-  EXPECT_FALSE(manager_->IsProcessing());
+  EXPECT_FALSE(installer_->IsProcessing());
 
   ProcessImageUntilConfigured();
 
@@ -450,37 +447,37 @@
                                         kDownloadedPluginVmImageSizeInMb, 1);
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest, CancelledDownloadTest) {
+TEST_F(PluginVmInstallerDownloadServiceTest, CancelledDownloadTest) {
   EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0);
   EXPECT_CALL(*observer_, OnDownloadCancelled());
 
-  manager_->StartDownload();
-  manager_->CancelDownload();
+  installer_->StartDownload();
+  installer_->CancelDownload();
   task_environment_.RunUntilIdle();
   // Finishing image processing as it should really happen.
-  manager_->OnDownloadCancelled();
+  installer_->OnDownloadCancelled();
 
   histogram_tester_->ExpectTotalCount(kPluginVmImageDownloadedSizeHistogram, 0);
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest, ImportNonExistingImageTest) {
+TEST_F(PluginVmInstallerDownloadServiceTest, ImportNonExistingImageTest) {
   SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
 
   EXPECT_CALL(*observer_, OnDownloadCompleted());
-  EXPECT_CALL(*observer_,
-              OnImportFailed(
-                  PluginVmImageManager::FailureReason::COULD_NOT_OPEN_IMAGE));
+  EXPECT_CALL(
+      *observer_,
+      OnImportFailed(PluginVmInstaller::FailureReason::COULD_NOT_OPEN_IMAGE));
 
   ProcessImageUntilImporting();
   // Should fail as fake downloaded file isn't set.
-  manager_->StartImport();
+  installer_->StartImport();
   task_environment_.RunUntilIdle();
 
   histogram_tester_->ExpectUniqueSample(kPluginVmImageDownloadedSizeHistogram,
                                         kDownloadedPluginVmImageSizeInMb, 1);
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest, CancelledImportTest) {
+TEST_F(PluginVmInstallerDownloadServiceTest, CancelledImportTest) {
   SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
   SetupConciergeForCancelDiskImageOperation(fake_concierge_client_,
                                             true /* success */);
@@ -491,18 +488,18 @@
   ProcessImageUntilImporting();
 
   // Faking downloaded file for testing.
-  manager_->SetDownloadedPluginVmImageArchiveForTesting(
+  installer_->SetDownloadedPluginVmImageArchiveForTesting(
       fake_downloaded_plugin_vm_image_archive_);
-  manager_->StartImport();
-  manager_->CancelImport();
+  installer_->StartImport();
+  installer_->CancelImport();
   task_environment_.RunUntilIdle();
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest, EmptyPluginVmImageUrlTest) {
+TEST_F(PluginVmInstallerDownloadServiceTest, EmptyPluginVmImageUrlTest) {
   SetPluginVmImagePref("", kHash);
   EXPECT_CALL(
       *observer_,
-      OnDownloadFailed(PluginVmImageManager::FailureReason::INVALID_IMAGE_URL));
+      OnDownloadFailed(PluginVmInstaller::FailureReason::INVALID_IMAGE_URL));
   EXPECT_CALL(*observer_, OnDlcDownloadStarted());
   EXPECT_CALL(*observer_, OnDlcDownloadCompleted());
   ProcessImageUntilImporting();
@@ -510,85 +507,80 @@
   histogram_tester_->ExpectTotalCount(kPluginVmImageDownloadedSizeHistogram, 0);
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest, VerifyDownloadTest) {
-  EXPECT_FALSE(manager_->VerifyDownload(kHash2));
-  EXPECT_TRUE(manager_->VerifyDownload(kHashUppercase));
-  EXPECT_TRUE(manager_->VerifyDownload(kHash));
-  EXPECT_FALSE(manager_->VerifyDownload(std::string()));
+TEST_F(PluginVmInstallerDownloadServiceTest, VerifyDownloadTest) {
+  EXPECT_FALSE(installer_->VerifyDownload(kHash2));
+  EXPECT_TRUE(installer_->VerifyDownload(kHashUppercase));
+  EXPECT_TRUE(installer_->VerifyDownload(kHash));
+  EXPECT_FALSE(installer_->VerifyDownload(std::string()));
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest,
+TEST_F(PluginVmInstallerDownloadServiceTest,
        CannotStartDownloadIfDlcDownloadNotRun) {
-  EXPECT_CALL(
-      *observer_,
-      OnDownloadFailed(
-          PluginVmImageManager::FailureReason::DLC_DOWNLOAD_NOT_STARTED));
+  EXPECT_CALL(*observer_,
+              OnDownloadFailed(
+                  PluginVmInstaller::FailureReason::DLC_DOWNLOAD_NOT_STARTED));
   EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0);
-  manager_->StartDownload();
+  installer_->StartDownload();
   task_environment_.RunUntilIdle();
 }
 
-TEST_F(PluginVmImageManagerDownloadServiceTest,
+TEST_F(PluginVmInstallerDownloadServiceTest,
        CannotStartDlcDownloadIfPluginVmGetsDisabled) {
   profile_->ScopedCrosSettingsTestHelper()->SetBoolean(
       chromeos::kPluginVmAllowed, false);
-  EXPECT_CALL(
-      *observer_,
-      OnDownloadFailed(PluginVmImageManager::FailureReason::NOT_ALLOWED));
+  EXPECT_CALL(*observer_,
+              OnDownloadFailed(PluginVmInstaller::FailureReason::NOT_ALLOWED));
   EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(0);
-  manager_->StartDlcDownload();
+  installer_->StartDlcDownload();
   task_environment_.RunUntilIdle();
 }
 
-TEST_F(PluginVmImageManagerDriveTest, InvalidDriveUrlTest) {
+TEST_F(PluginVmInstallerDriveTest, InvalidDriveUrlTest) {
   SetPluginVmImagePref(kDriveUrl2, kHash);
 
   EXPECT_CALL(*observer_, OnDownloadStarted());
   EXPECT_CALL(
       *observer_,
-      OnDownloadFailed(PluginVmImageManager::FailureReason::INVALID_IMAGE_URL));
+      OnDownloadFailed(PluginVmInstaller::FailureReason::INVALID_IMAGE_URL));
   ProcessImageUntilImporting();
 }
 
-TEST_F(PluginVmImageManagerDriveTest, NoConnectionDriveTest) {
+TEST_F(PluginVmInstallerDriveTest, NoConnectionDriveTest) {
   SetPluginVmImagePref(kDriveUrl, kHash);
   fake_drive_service_->set_offline(true);
 
   EXPECT_CALL(*observer_, OnDownloadStarted());
-  EXPECT_CALL(
-      *observer_,
-      OnDownloadFailed(
-          PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_NETWORK));
+  EXPECT_CALL(*observer_,
+              OnDownloadFailed(
+                  PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_NETWORK));
   ProcessImageUntilImporting();
 }
 
-TEST_F(PluginVmImageManagerDriveTest, WrongHashDriveTest) {
+TEST_F(PluginVmInstallerDriveTest, WrongHashDriveTest) {
   SetPluginVmImagePref(kDriveUrl, kHash2);
 
   EXPECT_CALL(*observer_, OnDownloadStarted());
-  EXPECT_CALL(
-      *observer_,
-      OnDownloadFailed(PluginVmImageManager::FailureReason::HASH_MISMATCH));
+  EXPECT_CALL(*observer_, OnDownloadFailed(
+                              PluginVmInstaller::FailureReason::HASH_MISMATCH));
 
   ProcessImageUntilImporting();
 }
 
-TEST_F(PluginVmImageManagerDriveTest, DriveDownloadFailedAfterStartingTest) {
+TEST_F(PluginVmInstallerDriveTest, DriveDownloadFailedAfterStartingTest) {
   SetPluginVmImagePref(kDriveUrl, kHash);
   SimpleFakeDriveService* fake_drive_service = SetUpSimpleFakeDriveService();
 
   EXPECT_CALL(*observer_, OnDownloadStarted());
   EXPECT_CALL(*observer_, OnDownloadProgressUpdated(5, 100, _));
   EXPECT_CALL(*observer_, OnDownloadProgressUpdated(10, 100, _));
-  EXPECT_CALL(
-      *observer_,
-      OnDownloadFailed(
-          PluginVmImageManager::FailureReason::DOWNLOAD_FAILED_NETWORK));
+  EXPECT_CALL(*observer_,
+              OnDownloadFailed(
+                  PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_NETWORK));
   EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0);
 
-  manager_->StartDlcDownload();
+  installer_->StartDlcDownload();
   task_environment_.RunUntilIdle();
-  manager_->StartDownload();
+  installer_->StartDownload();
   task_environment_.RunUntilIdle();
 
   fake_drive_service->RunGetContentCallback(
@@ -601,7 +593,7 @@
                                             std::unique_ptr<std::string>());
 }
 
-TEST_F(PluginVmImageManagerDriveTest, CancelledDriveDownloadTest) {
+TEST_F(PluginVmInstallerDriveTest, CancelledDriveDownloadTest) {
   SetPluginVmImagePref(kDriveUrl, kHash);
   SimpleFakeDriveService* fake_drive_service = SetUpSimpleFakeDriveService();
 
@@ -609,20 +601,20 @@
   EXPECT_CALL(*observer_, OnDownloadProgressUpdated(5, 100, _));
   EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0);
 
-  manager_->StartDlcDownload();
+  installer_->StartDlcDownload();
   task_environment_.RunUntilIdle();
-  manager_->StartDownload();
+  installer_->StartDownload();
   task_environment_.RunUntilIdle();
 
   fake_drive_service->RunGetContentCallback(
       google_apis::HTTP_SUCCESS, std::make_unique<std::string>("Part1"));
   fake_drive_service->RunProgressCallback(5, 100);
-  manager_->CancelDownload();
+  installer_->CancelDownload();
   task_environment_.RunUntilIdle();
   EXPECT_TRUE(fake_drive_service->cancel_callback_called());
 }
 
-TEST_F(PluginVmImageManagerDriveTest, SuccessfulDriveDownloadTest) {
+TEST_F(PluginVmInstallerDriveTest, SuccessfulDriveDownloadTest) {
   SetPluginVmImagePref(kDriveUrl, kHash);
 
   EXPECT_CALL(*observer_, OnDownloadStarted());
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc
index 87f9d733..5f1577b 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc
@@ -420,7 +420,7 @@
   if (result == PluginVmLaunchResult::kVmMissing) {
     profile_->GetPrefs()->SetBoolean(plugin_vm::prefs::kPluginVmImageExists,
                                      false);
-    plugin_vm::ShowPluginVmLauncherView(profile_);
+    plugin_vm::ShowPluginVmInstallerView(profile_);
   }
 
   RecordPluginVmLaunchResultHistogram(result);
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_util.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_util.cc
index 14fcdf2..592b3de 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_util.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_util.cc
@@ -12,7 +12,6 @@
 #include "base/files/file_util.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_drive_image_download_service.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_util.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_util.h
index 3c4424c..4a42c96 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_util.h
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_util.h
@@ -60,7 +60,7 @@
 // Determines if the default Plugin VM is running and visible.
 bool IsPluginVmRunning(Profile* profile);
 
-void ShowPluginVmLauncherView(Profile* profile);
+void ShowPluginVmInstallerView(Profile* profile);
 
 // Checks if an window is for plugin vm.
 bool IsPluginVmWindow(const aura::Window* window);
diff --git a/chrome/browser/extensions/api/device_permissions_manager_unittest.cc b/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
index b422d110..a2cfc5f9 100644
--- a/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
+++ b/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
@@ -75,13 +75,13 @@
     base::RunLoop().RunUntilIdle();
 
     device4_ = fake_hid_manager_.CreateAndAddDevice(
-        0, 0, "Test HID Device", "abcde", HidBusType::kHIDBusTypeUSB);
-    device5_ = fake_hid_manager_.CreateAndAddDevice(0, 0, "Test HID Device", "",
-                                                    HidBusType::kHIDBusTypeUSB);
+        "4", 0, 0, "Test HID Device", "abcde", HidBusType::kHIDBusTypeUSB);
+    device5_ = fake_hid_manager_.CreateAndAddDevice(
+        "5", 0, 0, "Test HID Device", "", HidBusType::kHIDBusTypeUSB);
     device6_ = fake_hid_manager_.CreateAndAddDevice(
-        0, 0, "Test HID Device", "67890", HidBusType::kHIDBusTypeUSB);
-    device7_ = fake_hid_manager_.CreateAndAddDevice(0, 0, "Test HID Device", "",
-                                                    HidBusType::kHIDBusTypeUSB);
+        "6", 0, 0, "Test HID Device", "67890", HidBusType::kHIDBusTypeUSB);
+    device7_ = fake_hid_manager_.CreateAndAddDevice(
+        "7", 0, 0, "Test HID Device", "", HidBusType::kHIDBusTypeUSB);
   }
 
   void TearDown() override { env_.reset(nullptr); }
diff --git a/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
index 3739ff2..6b57d40a 100644
--- a/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
@@ -27,7 +27,6 @@
   };
 
   orig->render_process_id_ = 1;
-  orig->render_frame_id_ = 2;
   orig->extra_info_spec_ = 3;
 
   orig->request_body_.reset(new base::DictionaryValue);
@@ -49,7 +48,6 @@
       orig->CreatePublicSessionCopy();
 
   EXPECT_EQ(orig->render_process_id_, copy->render_process_id_);
-  EXPECT_EQ(orig->render_frame_id_, copy->render_frame_id_);
   EXPECT_EQ(0, copy->extra_info_spec_);
 
   EXPECT_EQ(nullptr, copy->request_body_);
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 127613b7..e730613 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -954,20 +954,13 @@
 
   ExtensionManagement* management =
       ExtensionManagementFactory::GetForBrowserContext(profile());
+
   PermissionsUpdater(profile()).SetDefaultPolicyHostRestrictions(
       management->GetDefaultPolicyBlockedHosts(),
       management->GetDefaultPolicyAllowedHosts());
+
   for (const auto& extension : registry_->enabled_extensions()) {
-    bool uses_default =
-        management->UsesDefaultPolicyHostRestrictions(extension.get());
-    if (uses_default) {
-      PermissionsUpdater(profile()).SetUsesDefaultHostRestrictions(
-          extension.get());
-    } else {
-      PermissionsUpdater(profile()).SetPolicyHostRestrictions(
-          extension.get(), management->GetPolicyBlockedHosts(extension.get()),
-          management->GetPolicyAllowedHosts(extension.get()));
-    }
+    SetPolicySettingsForExtension(extension.get());
   }
 
   // Loop through the disabled extension list, find extensions to re-enable
@@ -1643,6 +1636,19 @@
     MaybeFinishDelayedInstallations();
 }
 
+void ExtensionService::SetPolicySettingsForExtension(
+    const Extension* extension) {
+  ExtensionManagement* management =
+      ExtensionManagementFactory::GetForBrowserContext(profile());
+  if (management->UsesDefaultPolicyHostRestrictions(extension)) {
+    PermissionsUpdater(profile()).SetUsesDefaultHostRestrictions(extension);
+  } else {
+    PermissionsUpdater(profile()).SetPolicyHostRestrictions(
+        extension, management->GetPolicyBlockedHosts(extension),
+        management->GetPolicyAllowedHosts(extension));
+  }
+}
+
 const Extension* ExtensionService::GetPendingExtensionUpdate(
     const std::string& id) const {
   return delayed_installs_.GetByID(id);
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index 525b9d9..61063f6 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -487,6 +487,11 @@
   // Common helper to finish installing the given extension.
   void FinishInstallation(const Extension* extension);
 
+  // Sets the policy settings for the extension basically
+  // by delegating this to the permission_data_updater.
+  // Holds for default and policy settings.
+  void SetPolicySettingsForExtension(const Extension* extension);
+
   // Disables the extension if the privilege level has increased
   // (e.g., due to an upgrade).
   void CheckPermissionsIncrease(const Extension* extension,
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc
index b5c5b9e..7ac8f05 100644
--- a/chrome/browser/extensions/permissions_updater.cc
+++ b/chrome/browser/extensions/permissions_updater.cc
@@ -34,6 +34,7 @@
 #include "extensions/browser/event_router_factory.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/browser/notification_types.h"
 #include "extensions/common/cors_util.h"
 #include "extensions/common/extension.h"
@@ -430,7 +431,8 @@
 
 void PermissionsUpdater::SetUsesDefaultHostRestrictions(
     const Extension* extension) {
-  extension->permissions_data()->SetUsesDefaultHostRestrictions();
+  extension->permissions_data()->SetUsesDefaultHostRestrictions(
+      util::GetBrowserContextId(browser_context_));
   NetworkPermissionsUpdateHelper::UpdatePermissions(browser_context_, POLICY,
                                                     extension, PermissionSet(),
                                                     base::DoNothing::Once());
@@ -442,6 +444,7 @@
   DCHECK_EQ(0, init_flag_ & INIT_FLAG_TRANSIENT);
 
   PermissionsData::SetDefaultPolicyHostRestrictions(
+      util::GetBrowserContextId(browser_context_),
       default_runtime_blocked_hosts, default_runtime_allowed_hosts);
 
   // Update the BrowserContext origin lists, and send notification to the
@@ -538,6 +541,8 @@
       SetPolicyHostRestrictions(extension,
                                 management->GetPolicyBlockedHosts(extension),
                                 management->GetPolicyAllowedHosts(extension));
+    } else {
+      SetUsesDefaultHostRestrictions(extension);
     }
   }
 
diff --git a/chrome/browser/extensions/permissions_updater_unittest.cc b/chrome/browser/extensions/permissions_updater_unittest.cc
index 2aa2dd2..6125ad2 100644
--- a/chrome/browser/extensions/permissions_updater_unittest.cc
+++ b/chrome/browser/extensions/permissions_updater_unittest.cc
@@ -27,6 +27,7 @@
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_service.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/extension_features.h"
@@ -348,8 +349,9 @@
     AddPattern(&default_policy_blocked_hosts, "http://*.google.com/*");
     PermissionsUpdater updater(profile());
     updater.InitializePermissions(extension.get());
-    extension->permissions_data()->SetDefaultPolicyHostRestrictions(
-        default_policy_blocked_hosts, default_policy_allowed_hosts);
+    PermissionsData::SetDefaultPolicyHostRestrictions(
+        util::GetBrowserContextId(profile()), default_policy_blocked_hosts,
+        default_policy_allowed_hosts);
 
     // By default, all subdomains of google.com should be blocked.
     const GURL kOrigin("http://foo.com");
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index d891360..944a797 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1254,6 +1254,11 @@
     "expiry_milestone": 83
   },
   {
+    "name": "enable-desktop-pwas-tab-strip",
+    "owners": [ "desktop-pwas-team@google.com" ],
+    "expiry_milestone": 84
+  },
+  {
     "name": "enable-devtools-experiments",
     "owners": [ "//third_party/devtools-frontend/src/OWNERS" ],
     // This is a catch-all for ongoing devtools experiments.
@@ -1336,8 +1341,8 @@
   },
   {
     "name": "enable-experimental-kernel-vm-support",
-    "owners": [ "jflat", "zwisler" ],
-    "expiry_milestone": 82
+    "owners": [ "zwisler" ],
+    "expiry_milestone": 87
   },
   {
     "name": "enable-experimental-productivity-features",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 3a8a7b82..d97689c9 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -644,6 +644,11 @@
     "Enable installed PWAs to update their app manifest data when the site "
     "manifest data has changed.";
 
+extern const char kDesktopPWAsTabStripName[] = "Desktop PWA tab strips";
+extern const char kDesktopPWAsTabStripDescription[] =
+    "Experimental UI for exploring what PWA windows would look like with a tab "
+    "strip.";
+
 const char kEnableSystemWebAppsName[] = "System Web Apps";
 const char kEnableSystemWebAppsDescription[] =
     "Experimental system for using the Desktop PWA framework for running System"
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index b2bafef..a7bdb9ad 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -398,6 +398,9 @@
 extern const char kDesktopPWAsLocalUpdatingName[];
 extern const char kDesktopPWAsLocalUpdatingDescription[];
 
+extern const char kDesktopPWAsTabStripName[];
+extern const char kDesktopPWAsTabStripDescription[];
+
 extern const char kEnableSystemWebAppsName[];
 extern const char kEnableSystemWebAppsDescription[];
 
diff --git a/chrome/browser/gcm/OWNERS b/chrome/browser/gcm/OWNERS
index df07bd5..e89137cb 100644
--- a/chrome/browser/gcm/OWNERS
+++ b/chrome/browser/gcm/OWNERS
@@ -2,7 +2,6 @@
 fgorski@chromium.org
 jianli@chromium.org
 peter@chromium.org
-zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
 # TEAM: platform-capabilities@chromium.org 
diff --git a/chrome/browser/metrics/perf/perf_events_collector.cc b/chrome/browser/metrics/perf/perf_events_collector.cc
index 2fc8d062..85589905 100644
--- a/chrome/browser/metrics/perf/perf_events_collector.cc
+++ b/chrome/browser/metrics/perf/perf_events_collector.cc
@@ -246,8 +246,9 @@
     return GetDefaultCommands_x86_64(cpuid);
 
   std::vector<WeightAndValue> cmds;
-  if (cpuid.arch == "x86" ||     // 32-bit x86, or...
-      cpuid.arch == "armv7l") {  // ARM
+  if (cpuid.arch == "x86" ||      // 32-bit x86, or...
+      cpuid.arch == "armv7l" ||   // ARM32
+      cpuid.arch == "aarch64") {  // ARM64
     cmds.push_back(WeightAndValue(80.0, kPerfCyclesCmd));
     cmds.push_back(WeightAndValue(20.0, kPerfFPCallgraphCmd));
     return cmds;
diff --git a/chrome/browser/metrics/perf/perf_events_collector_unittest.cc b/chrome/browser/metrics/perf/perf_events_collector_unittest.cc
index 7e1323b..d66aca5 100644
--- a/chrome/browser/metrics/perf/perf_events_collector_unittest.cc
+++ b/chrome/browser/metrics/perf/perf_events_collector_unittest.cc
@@ -519,7 +519,7 @@
   EXPECT_NE(cmds.end(), found);
 }
 
-TEST_F(PerfCollectorTest, DefaultCommandsBasedOnArch_Arm) {
+TEST_F(PerfCollectorTest, DefaultCommandsBasedOnArch_Arm32) {
   CPUIdentity cpuid;
   cpuid.arch = "armv7l";
   cpuid.vendor = "";
@@ -536,12 +536,37 @@
                    [](const RandomSelector::WeightAndValue& cmd) -> bool {
                      return cmd.value == kPerfLBRCmd;
                    });
-  EXPECT_EQ(cmds.end(), found) << "ARM does not support this command";
+  EXPECT_EQ(cmds.end(), found) << "ARM32 does not support this command";
   found = std::find_if(cmds.begin(), cmds.end(),
                        [](const RandomSelector::WeightAndValue& cmd) -> bool {
                          return cmd.value == kPerfCacheMissesCmd;
                        });
-  EXPECT_EQ(cmds.end(), found) << "ARM does not support this command";
+  EXPECT_EQ(cmds.end(), found) << "ARM32 does not support this command";
+}
+
+TEST_F(PerfCollectorTest, DefaultCommandsBasedOnArch_Arm64) {
+  CPUIdentity cpuid;
+  cpuid.arch = "aarch64";
+  cpuid.vendor = "";
+  cpuid.family = 0;
+  cpuid.model = 0;
+  cpuid.model_name = "";
+  std::vector<RandomSelector::WeightAndValue> cmds =
+      internal::GetDefaultCommandsForCpu(cpuid);
+  ASSERT_GE(cmds.size(), 2UL);
+  EXPECT_EQ(cmds[0].value, kPerfCyclesCmd);
+  EXPECT_EQ(cmds[1].value, kPerfFPCallgraphCmd);
+  auto found =
+      std::find_if(cmds.begin(), cmds.end(),
+                   [](const RandomSelector::WeightAndValue& cmd) -> bool {
+                     return cmd.value == kPerfLBRCmd;
+                   });
+  EXPECT_EQ(cmds.end(), found) << "ARM64 does not support this command";
+  found = std::find_if(cmds.begin(), cmds.end(),
+                       [](const RandomSelector::WeightAndValue& cmd) -> bool {
+                         return cmd.value == kPerfCacheMissesCmd;
+                       });
+  EXPECT_EQ(cmds.end(), found) << "ARM64 does not support this command";
 }
 
 TEST_F(PerfCollectorTest, DefaultCommandsBasedOnArch_x86_32) {
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client.cc b/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client.cc
index a5af6fca..7907507a 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client.cc
@@ -78,14 +78,13 @@
     content::Visibility visibility) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  // Check for same state.
   if (current_visibility_ == visibility)
     return;
 
-  // Check if the visibility changed from VISIBLE to HIDDEN. Since navigation
-  // predictor is currently restricted to Android, it is okay to disregard the
-  // occluded state.
-  if (current_visibility_ != content::Visibility::HIDDEN ||
-      visibility != content::Visibility::VISIBLE) {
+  // Check if the visibility is now visible, if not, cancel future preconnects.
+  // If visible, we can begin preconnecting.
+  if (visibility != content::Visibility::VISIBLE) {
     current_visibility_ = visibility;
 
     // Stop any future preconnects while hidden.
@@ -141,6 +140,9 @@
   GURL preconnect_url_serialized(preconnect_origin.Serialize());
   DCHECK(preconnect_url_serialized.is_valid());
 
+  if (!loading_predictor)
+    return;
+
   loading_predictor->PrepareForPageLoad(
       preconnect_url_serialized, predictors::HintOrigin::NAVIGATION_PREDICTOR,
       true);
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc
index d8ebcb6..e835004 100644
--- a/chrome/browser/net/errorpage_browsertest.cc
+++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -1421,27 +1421,10 @@
 
   // InProcessBrowserTest:
   void SetUpOnMainThread() override {
-    // ERR_UNSAFE_PORT will not trigger navigation corrections.
-    url_loader_interceptor_ =
-        std::make_unique<content::URLLoaderInterceptor>(base::BindRepeating(
-            [](content::URLLoaderInterceptor::RequestParams* params) {
-              if (params->url_request.url.host() == kHostname) {
-                params->client->OnComplete(
-                    network::URLLoaderCompletionStatus(net::ERR_UNSAFE_PORT));
-                return true;
-              }
-              return false;
-            }));
-
     // Clear AcceptLanguages to force punycode decoding.
     browser()->profile()->GetPrefs()->SetString(
         language::prefs::kAcceptLanguages, std::string());
   }
-
-  void TearDownOnMainThread() override { url_loader_interceptor_.reset(); }
-
- private:
-  std::unique_ptr<content::URLLoaderInterceptor> url_loader_interceptor_;
 };
 
 const char ErrorPageForIDNTest::kHostname[] =
@@ -1452,8 +1435,11 @@
 
 // Make sure error page shows correct unicode for IDN.
 IN_PROC_BROWSER_TEST_F(ErrorPageForIDNTest, IDN) {
-  ui_test_utils::NavigateToURL(browser(),
-                               GURL("http://" + std::string(kHostname) + "/"));
+  // ERR_UNSAFE_PORT will not trigger navigation corrections.
+  ui_test_utils::NavigateToURL(
+      browser(),
+      URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT,
+                                                     kHostname));
   EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode));
 }
 
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker.cc b/chrome/browser/permissions/permission_decision_auto_blocker.cc
index 446337d87..8b892b68 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.cc
@@ -118,6 +118,18 @@
   return value ? value->GetInt() : 0;
 }
 
+base::Time GetEmbargoStartTime(base::Value* permission_dict,
+                               const base::Feature& feature,
+                               const char* key) {
+  base::Value* found =
+      permission_dict->FindKeyOfType(key, base::Value::Type::DOUBLE);
+  if (found && base::FeatureList::IsEnabled(feature)) {
+    return base::Time::FromDeltaSinceWindowsEpoch(
+        base::TimeDelta::FromMicroseconds(found->GetDouble()));
+  }
+  return base::Time();
+}
+
 bool IsUnderEmbargo(base::Value* permission_dict,
                     const base::Feature& feature,
                     const char* key,
@@ -292,6 +304,30 @@
       permission, clock_->Now());
 }
 
+base::Time PermissionDecisionAutoBlocker::GetEmbargoStartTime(
+    const GURL& request_origin,
+    ContentSettingsType permission) {
+  auto* settings_map = HostContentSettingsMapFactory::GetForProfile(profile_);
+  DCHECK(settings_map);
+  std::unique_ptr<base::DictionaryValue> dict =
+      GetOriginAutoBlockerData(settings_map, request_origin);
+  base::Value* permission_dict = GetOrCreatePermissionDict(
+      dict.get(), PermissionUtil::GetPermissionString(permission));
+
+  // A permission may have a record for both dismisal and ignore, return the
+  // most recent. A permission will only actually be under one embargo, but
+  // the record of embargo start will persist until explicitly deleted
+  base::Time dismissal_start_time = ::GetEmbargoStartTime(
+      permission_dict, features::kBlockPromptsIfDismissedOften,
+      kPermissionDismissalEmbargoKey);
+  base::Time ignore_start_time = ::GetEmbargoStartTime(
+      permission_dict, features::kBlockPromptsIfIgnoredOften,
+      kPermissionIgnoreEmbargoKey);
+
+  return dismissal_start_time > ignore_start_time ? dismissal_start_time
+                                                  : ignore_start_time;
+}
+
 int PermissionDecisionAutoBlocker::GetDismissCount(
     const GURL& url,
     ContentSettingsType permission) {
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker.h b/chrome/browser/permissions/permission_decision_auto_blocker.h
index 63a0f575..b22e6a4 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker.h
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.h
@@ -74,6 +74,13 @@
   PermissionResult GetEmbargoResult(const GURL& request_origin,
                                     ContentSettingsType permission);
 
+  // Returns the most recent recorded time either an ignore or dismiss embargo
+  // was started. Records of embargo start times persist beyond the duration of
+  // the embargo, but are removed along with embargoes when RemoveEmbargoByUrl
+  // or RemoveCountsByUrl are used. Returns base::Time() if no record is found.
+  base::Time GetEmbargoStartTime(const GURL& request_origin,
+                                 ContentSettingsType permission);
+
   // Returns the current number of dismisses recorded for |permission| type at
   // |url|.
   int GetDismissCount(const GURL& url, ContentSettingsType permission);
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
index 3d3f49e..5f2341c1 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
@@ -433,6 +433,119 @@
   EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
 }
 
+// Check that GetEmbargoStartTime returns the correct time for embargoes whether
+// they are nonexistent, expired or active.
+TEST_F(PermissionDecisionAutoBlockerUnitTest, CheckEmbargoStartTime) {
+  GURL url("https://www.google.com");
+
+  // The time recorded for embargoes will be stored as a double, which will
+  // cause aliasing to a limited set of base::Time values upon retrieval. We
+  // thus pick a base::Time for our test time that is part of this set via
+  // aliasing the current time by passing it through a double. This allows us
+  // to directly compare the test time and times retrieved from storage.
+  base::Time test_time = base::Time::FromDeltaSinceWindowsEpoch(
+      base::TimeDelta::FromMicroseconds(static_cast<double>(
+          base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds())));
+  clock()->SetNow(test_time);
+
+  // Check the default non embargod state.
+  base::Time embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(base::Time(), embargo_start_time);
+
+  // Ensure that dismissing less than the required number for an embargo
+  // does not record an embargo start time.
+  EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(base::Time(), embargo_start_time);
+
+  // Place site under geolocation dismissal embargo.
+  EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+
+  // Confirm embargo is recorded as starting at the correct time.
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(test_time, embargo_start_time);
+
+  // Ensure moving clock while within embargo period does not affect embargo
+  // start time.
+  clock()->Advance(base::TimeDelta::FromDays(5));
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(test_time, embargo_start_time);
+
+  // Move clock beyond embaro (plus a small offset for potential precision
+  // errors) and confirm start time is unaffected but embargo is suspended.
+  clock()->Advance(base::TimeDelta::FromHours(3 * 24 + 1));
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(test_time, embargo_start_time);
+  PermissionResult result =
+      autoblocker()->GetEmbargoResult(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
+  EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
+
+  // Advance time, reinstate embargo and confirm that time is updated.
+  test_time += base::TimeDelta::FromDays(9);
+  test_time = base::Time::FromDeltaSinceWindowsEpoch(
+      base::TimeDelta::FromMicroseconds(static_cast<double>(
+          test_time.ToDeltaSinceWindowsEpoch().InMicroseconds())));
+  clock()->SetNow(test_time);
+
+  EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(test_time, embargo_start_time);
+
+  // Advance time to expire dismiss embargo and create new embargo for ignoring.
+  test_time += base::TimeDelta::FromDays(7);
+  test_time = base::Time::FromDeltaSinceWindowsEpoch(
+      base::TimeDelta::FromMicroseconds(static_cast<double>(
+          test_time.ToDeltaSinceWindowsEpoch().InMicroseconds())));
+  clock()->SetNow(test_time);
+
+  EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  EXPECT_TRUE(autoblocker()->RecordIgnoreAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+
+  // Confirm the most recent embargo is updated to match new ignore embargo.
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(test_time, embargo_start_time);
+
+  // Advance time, reinstate the dismiss embargo via a single action, and
+  // confirm that time is updated.
+  test_time += base::TimeDelta::FromDays(1);
+  test_time = base::Time::FromDeltaSinceWindowsEpoch(
+      base::TimeDelta::FromMicroseconds(static_cast<double>(
+          test_time.ToDeltaSinceWindowsEpoch().InMicroseconds())));
+  clock()->SetNow(test_time);
+
+  EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
+      url, ContentSettingsType::GEOLOCATION, false));
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(test_time, embargo_start_time);
+
+  // Remove records of dismiss and ignore embargoes and confirm start time
+  // reverts to default.
+  autoblocker()->RemoveCountsByUrl(base::Bind(&FilterGoogle));
+  embargo_start_time =
+      autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
+  EXPECT_EQ(base::Time(), embargo_start_time);
+}
+
 // Tests the alternating pattern of the block on multiple dismiss behaviour. On
 // N dismissals, the origin to be embargoed for the requested permission and
 // automatically blocked. Each time the embargo is lifted, the site gets another
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 2012f20..c50aaa9 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1702,6 +1702,11 @@
       SCHEMA_ALLOW_UNKNOWN,
       SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
       SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
+  handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
+      key::kPerAppTimeLimitsWhitelist, prefs::kPerAppTimeLimitsWhitelistPolicy,
+      chrome_schema, SCHEMA_ALLOW_UNKNOWN,
+      SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
+      SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
   handlers->AddHandler(
       std::make_unique<EcryptfsMigrationStrategyPolicyHandler>());
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index c3e9874..b2a459fb 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -252,6 +252,7 @@
 #include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
 #include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h"
 #include "chrome/browser/chromeos/child_accounts/screen_time_controller.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
 #include "chrome/browser/chromeos/cryptauth/cryptauth_device_id_provider_impl.h"
@@ -948,6 +949,7 @@
   certificate_manager::CertificatesHandler::RegisterProfilePrefs(registry);
   chromeos::AccountManager::RegisterPrefs(registry);
   chromeos::ApkWebAppService::RegisterProfilePrefs(registry);
+  chromeos::app_time::AppTimeController::RegisterProfilePrefs(registry);
   chromeos::assistant::prefs::RegisterProfilePrefs(registry);
   chromeos::bluetooth::DebugLogsManager::RegisterPrefs(registry);
   chromeos::CupsPrintersManager::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ar.xtb
index 144574d9..82da8a12 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ar.xtb
@@ -374,7 +374,7 @@
 <translation id="3538907380453898475">dscrplst</translation>
 <translation id="3549141990712742152">قص <ph name="TEXT" />.</translation>
 <translation id="3549680091535286226">النقر بإصبعين لإيقاف الكلام مؤقتًا</translation>
-<translation id="3568702578574425662">لم يتم تحديد مربع الاختيار <ph name="NAME" /></translation>
+<translation id="3568702578574425662">لم يتم وضع علامة في مربّع الاختيار <ph name="NAME" /></translation>
 <translation id="3589661172894441357">مسرد مصطلحات</translation>
 <translation id="3591784666823501596">أزرق ملكي</translation>
 <translation id="3594207934078151302">أخضر بحري متوسط</translation>
@@ -419,7 +419,7 @@
 <translation id="3914732343065571127">‏مرجع أوامر ChromeVox</translation>
 <translation id="3930383913623796990">أخضر ربيعي</translation>
 <translation id="3930498801443296724">اقتباس مستمد</translation>
-<translation id="3935615366277838204">حرف كبير<ph name="LETTER" /></translation>
+<translation id="3935615366277838204">حرف كبير <ph name="LETTER" /></translation>
 <translation id="3936394396199829062">أرجواني فاتح</translation>
 <translation id="3941269780691800708">نطق النص أسفل الماوس.</translation>
 <translation id="394953087167197343">الإشارة إلى الأخطاء الإملائية:</translation>
@@ -552,7 +552,7 @@
 <translation id="4815668758102003883">فيروزي باهت</translation>
 <translation id="4826415162591436065">التنقل للأمام</translation>
 <translation id="4826604887384865800">الانتقال التالي</translation>
-<translation id="4827410568042294688">تم إلغاء التحديد</translation>
+<translation id="4827410568042294688">تم إلغاء الاختيار</translation>
 <translation id="4838490795649708173">النقر بأربعة أصابع</translation>
 <translation id="4839925464551908214">انتقِل إلى الصف السابق.</translation>
 <translation id="4841614409681890122">وردي غامق</translation>
@@ -613,7 +613,7 @@
 <translation id="5138912041966667164">أزرق متوسط مائل إلى الرمادي</translation>
 <translation id="5140016802771803559">أرجواني داكن</translation>
 <translation id="5158275234811857234">غلاف</translation>
-<translation id="517143700877085897">، تم إلغاء التحديد</translation>
+<translation id="517143700877085897">، تم إلغاء الاختيار</translation>
 <translation id="5183440668879371625">السطر السابق بطريقة برايل</translation>
 <translation id="5184944171021383281">ليس هناك حقل نموذج تالٍ.</translation>
 <translation id="5189244881767082992">خط</translation>
@@ -673,7 +673,7 @@
 <translation id="5586942249556966598">عدم فعل شيء</translation>
 <translation id="5597170376237141345">مربع الاختيار التالي</translation>
 <translation id="5597933780944041114">ليس هناك عنوان تالٍ.</translation>
-<translation id="5598905979683743333">تم إلغاء تحديد زر الاختيار <ph name="NAME" /></translation>
+<translation id="5598905979683743333">تم إلغاء اختيار زر الاختيار <ph name="NAME" /></translation>
 <translation id="5601172225407283979">تنفيذ إجراء تلقائي</translation>
 <translation id="5608798115546226984">إكمال تلقائي مضمن</translation>
 <translation id="561939826962581046">الوقت</translation>
@@ -936,7 +936,7 @@
 <translation id="744163271241493234">pwded</translation>
 <translation id="7491962110804786152">علامة تبويب</translation>
 <translation id="7492049978501397201">مربع حوار تم الدخول إليه</translation>
-<translation id="7505149250476994901">نطق "حرف كبير" قبل كتابة الحرف</translation>
+<translation id="7505149250476994901">قُل "حرف كبير" قبل كتابة الحرف</translation>
 <translation id="7518543783849163354">‏لإيقاف ChromeVox مؤقتًا عن التحدث، اضغط على مفتاح Control.</translation>
 <translation id="7521682724501952239">‏يمكنك استخدام ChromeVox مع الشاشة التي تعمل باللمس.</translation>
 <translation id="7532613204005497612">حزيران (يونيو)</translation>
@@ -1152,7 +1152,7 @@
 <translation id="858006550102277544">تعليق</translation>
 <translation id="8584721346566392021">h5</translation>
 <translation id="8587549812518406253">عنصر القائمة التالي</translation>
-<translation id="860150890330522909">تم تحديد مربع الاختيار <ph name="NAME" /></translation>
+<translation id="860150890330522909">تم وضع علامة في مربّع الاختيار <ph name="NAME" /></translation>
 <translation id="8603071050456974042">‏لوحة ChromeVox</translation>
 <translation id="8606621670302093223">التحكم في التاريخ</translation>
 <translation id="8613709718990529335">أصفر حاد</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_es-419.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_es-419.xtb
index a1f3501b..854ecc3 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_es-419.xtb
@@ -419,7 +419,7 @@
 <translation id="3914732343065571127">Referencia de comandos de ChromeVox</translation>
 <translation id="3930383913623796990">Verde primavera</translation>
 <translation id="3930498801443296724">Cita inicial</translation>
-<translation id="3935615366277838204">Mayús <ph name="LETTER" /></translation>
+<translation id="3935615366277838204">Mayúscula <ph name="LETTER" /></translation>
 <translation id="3936394396199829062">Lavanda rojizo</translation>
 <translation id="3941269780691800708">Pronunciar el texto cuando pasas el puntero del mouse</translation>
 <translation id="394953087167197343">Indicar error ortográfico:</translation>
@@ -748,7 +748,7 @@
 <translation id="611827076493383239">vtd</translation>
 <translation id="6119955456199054975">Fin de celda</translation>
 <translation id="6122013438240733403">btn</translation>
-<translation id="6129953537138746214">Google Space</translation>
+<translation id="6129953537138746214">Espacio</translation>
 <translation id="6132506484792346370">Un cuadro de lista o uno combinado</translation>
 <translation id="6142308968191113180">Encabezado 4</translation>
 <translation id="6150023170003443621">Verde amarillo</translation>
@@ -936,7 +936,7 @@
 <translation id="744163271241493234">pwded</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7492049978501397201">Se ingresó un cuadro de diálogo.</translation>
-<translation id="7505149250476994901">Decir "mayús" antes de la letra</translation>
+<translation id="7505149250476994901">Decir "mayúscula" antes de la letra</translation>
 <translation id="7518543783849163354">Para silenciar ChromeVox de forma temporal, presiona la tecla Ctrl.</translation>
 <translation id="7521682724501952239">Puedes usar ChromeVox con la pantalla táctil.</translation>
 <translation id="7532613204005497612">Junio</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_eu.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_eu.xtb
index f3c3db33e..07bef3a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_eu.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_eu.xtb
@@ -418,7 +418,7 @@
 <translation id="3914732343065571127">ChromeVox agindu-erreferentzia</translation>
 <translation id="3930383913623796990">Berde bizia</translation>
 <translation id="3930498801443296724">Aipamena</translation>
-<translation id="3935615366277838204">Cap <ph name="LETTER" /></translation>
+<translation id="3935615366277838204"><ph name="LETTER" /> maiuskula</translation>
 <translation id="3936394396199829062">Izpiliku-kolore oso argikoa</translation>
 <translation id="3941269780691800708">Irakurri ozen saguaren kurtsorearen azpiko testua.</translation>
 <translation id="394953087167197343">Adierazi ortografia-akatsa:</translation>
@@ -935,7 +935,7 @@
 <translation id="744163271241493234">pwded</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7492049978501397201">Idatzitako elkarrizketa</translation>
-<translation id="7505149250476994901">Esan "cap" hizkia baino lehen</translation>
+<translation id="7505149250476994901">Esan "maiuskula" hizkia baino lehen</translation>
 <translation id="7518543783849163354">Aldi batez ChromeVox-ek hitz egiteari utz diezaion, sakatu Kontrol tekla.</translation>
 <translation id="7521682724501952239">Ukipen-pantailarekin ere erabil dezakezu ChromeVox.</translation>
 <translation id="7532613204005497612">Ekaina</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_is.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_is.xtb
index c9f4341a..dc3d951 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_is.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_is.xtb
@@ -418,7 +418,7 @@
 <translation id="3914732343065571127">Skipanir í ChromeVox</translation>
 <translation id="3930383913623796990">Vorgrænn</translation>
 <translation id="3930498801443296724">Útdregin tilvitnun</translation>
-<translation id="3935615366277838204">Hástafurinn <ph name="LETTER" /></translation>
+<translation id="3935615366277838204">Stórt <ph name="LETTER" /></translation>
 <translation id="3936394396199829062">Ljósfjólubleikur</translation>
 <translation id="3941269780691800708">Textaupplestur á því sem er undir músarbendli</translation>
 <translation id="394953087167197343">Gefa ábendingu um ritvillu:</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_my.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_my.xtb
index 2512053..3a362066 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_my.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_my.xtb
@@ -936,7 +936,7 @@
 <translation id="744163271241493234">pwded</translation>
 <translation id="7491962110804786152">တဲဘ်</translation>
 <translation id="7492049978501397201">စကားပြောကွက်သို့ ဝင်ရောက်</translation>
-<translation id="7505149250476994901">စကားလုံးရှေ့တွင် "ကပ်" ဟု ပြောပါ</translation>
+<translation id="7505149250476994901">စကားလုံးရှေ့တွင် "ကက်ပ်" ဟု ပြောပါ</translation>
 <translation id="7518543783849163354">ChromeVox စကားပြောခြင်းမှ ခေတ္တရပ်ရန် Control ခလုတ်ကို နှိပ်ပါ။</translation>
 <translation id="7521682724501952239">ChromeVox ကို တို့ထိမျက်နှာပြင်နှင့် အသုံးပြုနိုင်ပါသည်။</translation>
 <translation id="7532613204005497612">ဇွန်</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ro.xtb
index 2e4e36db..fa6cf37 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_ro.xtb
@@ -855,7 +855,7 @@
 <translation id="699159175332639490">Căutare + O + W</translation>
 <translation id="6994042831499278539">Trimitere la glosar</translation>
 <translation id="6996566555547746822">Caseta combo următoare</translation>
-<translation id="6997224546856374593">Când citești majuscule:</translation>
+<translation id="6997224546856374593">Când se citesc majuscule:</translation>
 <translation id="700202842116345659">Intrare bibliografică</translation>
 <translation id="7005146664810010831">Nu a fost găsită nicio adresă URL.</translation>
 <translation id="7010712454773919705">Tasta de modificare ChromeVox</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sr.xtb
index 810cd01..427c5fa 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sr.xtb
@@ -419,7 +419,7 @@
 <translation id="3914732343065571127">Референца за команде за ChromeVox</translation>
 <translation id="3930383913623796990">Пролећнозелена</translation>
 <translation id="3930498801443296724">Кратки цитат</translation>
-<translation id="3935615366277838204">Велико слово <ph name="LETTER" /></translation>
+<translation id="3935615366277838204">Велико <ph name="LETTER" /></translation>
 <translation id="3936394396199829062">Светлољубичаста</translation>
 <translation id="3941269780691800708">Изговарај текст под мишем.</translation>
 <translation id="394953087167197343">Ознака за правописну грешку:</translation>
@@ -936,7 +936,7 @@
 <translation id="744163271241493234">лозинка</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7492049978501397201">Ушли сте у дијалог</translation>
-<translation id="7505149250476994901">Изговорите „cap“ (велико слово) пре слова</translation>
+<translation id="7505149250476994901">Изговорите „велико“ пре слова</translation>
 <translation id="7518543783849163354">Да бисте привремено спречили ChromeVox да говори, притисните тастер Control.</translation>
 <translation id="7521682724501952239">ChromeVox можете да користите са додирним екраном.</translation>
 <translation id="7532613204005497612">јун</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_te.xtb
index a9be6df..b576a11 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_te.xtb
@@ -855,7 +855,7 @@
 <translation id="699159175332639490">Search + O + W</translation>
 <translation id="6994042831499278539">పదకోశ సూచన</translation>
 <translation id="6996566555547746822">తరువాత కాంబో పెట్టె</translation>
-<translation id="6997224546856374593">క్యాపిటల్‌లు చదువుతున్నప్పుడు:</translation>
+<translation id="6997224546856374593">క్యాపిటల్స్ చదువుతున్నప్పుడు:</translation>
 <translation id="700202842116345659">వివరణపట్టి నమోదు</translation>
 <translation id="7005146664810010831">URL కనుగొనబడలేదు</translation>
 <translation id="7010712454773919705">ChromeVox మాడిఫైయర్ కీ</translation>
@@ -936,7 +936,7 @@
 <translation id="744163271241493234">pwded</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7492049978501397201">డైలాగ్‌లోకి ప్రవేశించారు</translation>
-<translation id="7505149250476994901">అక్షరానికి ముందు "క్యాప్" అనండి</translation>
+<translation id="7505149250476994901">క్యాపిటల్ అక్షరాన్ని పలికే ముందు "క్యాపిటల్" అని అనండి</translation>
 <translation id="7518543783849163354">ChromeVoxలో చదివి వినిపించే మోడ్‌ను తాత్కాలికంగా ఆపివేయడానికి, Control కీని నొక్కండి.</translation>
 <translation id="7521682724501952239">మీరు టచ్‌స్క్రీన్‌తో ChromeVoxని ఉపయోగించవచ్చు.</translation>
 <translation id="7532613204005497612">జూన్</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/strings/select_to_speak_strings_ar.xtb b/chrome/browser/resources/chromeos/accessibility/select_to_speak/strings/select_to_speak_strings_ar.xtb
index fa9c265b..01417d8 100644
--- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/strings/select_to_speak_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/strings/select_to_speak_strings_ar.xtb
@@ -12,7 +12,7 @@
 <translation id="3283583562490372694">غير مُحدّد</translation>
 <translation id="335581015389089642">الحديث</translation>
 <translation id="4004802134384979325">تم التحديد</translation>
-<translation id="4827410568042294688">تم إلغاء التحديد</translation>
+<translation id="4827410568042294688">تم إلغاء الاختيار</translation>
 <translation id="5901630391730855834">أصفر</translation>
 <translation id="6017514345406065928">أخضر</translation>
 <translation id="6475604559827479857">لون لتمييز الكلمة:</translation>
diff --git a/chrome/browser/resources/extensions/detail_view.html b/chrome/browser/resources/extensions/detail_view.html
index a96f27f..bbdd308 100644
--- a/chrome/browser/resources/extensions/detail_view.html
+++ b/chrome/browser/resources/extensions/detail_view.html
@@ -161,7 +161,7 @@
             icon-class="[[getIndicatorIcon_(data.controlledInfo.type)]]"
             icon-aria-label="[[data.controlledInfo.type]]">
         </cr-tooltip-icon>
-        <template is="dom-if" if="[[isTerminated_(data.state)]]">
+        <template is="dom-if" if="[[showReloadButton_(data.state)]]">
           <cr-button id="terminated-reload-button" class="action-button"
               on-click="onReloadTap_">
             $i18n{itemReload}
@@ -174,10 +174,15 @@
                 '$i18nPolymer{extensionEnabled}')]]"
             aria-describedby="name"
             checked="[[isEnabled_(data.state)]]"
-            on-change="onEnableChange_"
+            on-change="onEnableToggleChange_"
             disabled="[[!isEnableToggleEnabled_(data.*)]]"
-            hidden$="[[isTerminated_(data.state)]]">
+            hidden$="[[!showEnableToggle_(data.*)]]">
         </cr-toggle>
+        <cr-button id="enableButton"
+            on-click="onEnableButtonClick_"
+            hidden$="[[!showEnableButton_(data.*)]]">
+          $i18n{enableButton}
+        </cr-button>
       </div>
     </div>
     <div id="warnings" hidden$="[[!hasWarnings_(data.*)]]">
@@ -189,7 +194,7 @@
             [[item]]
           </template>
         </span>
-        <template is="dom-if" if="[[!isTerminated_(data.state)]]">
+        <template is="dom-if" if="[[!showReloadButton_(data.state)]]">
           <cr-button id="warnings-reload-button" class="action-button"
               on-click="onReloadTap_">
             $i18n{itemReload}
@@ -208,7 +213,7 @@
       </div>
       <div class="section continuation warning control-line"
           id="corrupted-warning"
-          hidden$="[[!data.disableReasons.corruptInstall]]">
+          hidden$="[[!showRepairButton_(data.disableReasons.corruptInstall)]]">
         <iron-icon class="warning-icon" icon="cr:warning"></iron-icon>
         <span>$i18n{itemCorruptInstall}</span>
         <cr-button id="repair-button" class="action-button"
diff --git a/chrome/browser/resources/extensions/detail_view.js b/chrome/browser/resources/extensions/detail_view.js
index 58230eb..4b41e36 100644
--- a/chrome/browser/resources/extensions/detail_view.js
+++ b/chrome/browser/resources/extensions/detail_view.js
@@ -31,7 +31,7 @@
 
 import {ItemDelegate} from './item.js';
 import {ItemBehavior} from './item_behavior.js';
-import {computeInspectableViewLabel, getItemSource, getItemSourceString, isControlled, isEnabled, userCanChangeEnablement} from './item_util.js';
+import {computeInspectableViewLabel, EnableControl, getEnableControl, getItemSource, getItemSourceString, isControlled, isEnabled, userCanChangeEnablement} from './item_util.js';
 import {navigation, Page} from './navigation_helper.js';
 
 Polymer({
@@ -153,16 +153,6 @@
   },
 
   /**
-   * Returns true if the extension is in the terminated state.
-   * @return {boolean}
-   * @private
-   */
-  isTerminated_: function() {
-    return this.data.state ===
-        chrome.developerPrivate.ExtensionState.TERMINATED;
-  },
-
-  /**
    * @return {boolean}
    * @private
    */
@@ -238,10 +228,15 @@
   },
 
   /** @private */
-  onEnableChange_: function() {
+  onEnableToggleChange_: function() {
     this.delegate.setItemEnabled(this.data.id, this.$.enableToggle.checked);
   },
 
+  /** @private */
+  onEnableButtonClick_: function() {
+    this.delegate.setItemEnabled(this.data.id, true);
+  },
+
   /**
    * @param {!{model: !{item: !chrome.developerPrivate.ExtensionView}}} e
    * @private
@@ -382,4 +377,44 @@
     return this.hasRuntimeHostPermissions_() &&
         !this.data.permissions.runtimeHostPermissions.hasAllHosts;
   },
+
+  /**
+   * Returns true if the reload button should be shown.
+   * @return {boolean}
+   * @private
+   */
+  showReloadButton_: function() {
+    return getEnableControl(this.data) === EnableControl.RELOAD;
+  },
+
+  /**
+   * Returns true if the repair button should be shown.
+   * @return {boolean}
+   * @private
+   */
+  showRepairButton_: function() {
+    return getEnableControl(this.data) === EnableControl.REPAIR;
+  },
+
+  /**
+   * Returns true if the enable toggle should be shown.
+   * @return {boolean}
+   * @private
+   */
+  showEnableToggle_: function() {
+    const enableControl = getEnableControl(this.data);
+    // We still show the toggle even if we also show the repair button in the
+    // detail view, because the repair button appears just beneath it.
+    return enableControl === EnableControl.ENABLE_TOGGLE ||
+        enableControl === EnableControl.REPAIR;
+  },
+
+  /**
+   * Returns true if the enable button should be shown.
+   * @return {boolean}
+   * @private
+   */
+  showEnableButton_: function() {
+    return getEnableControl(this.data) === EnableControl.ENABLE_BUTTON;
+  },
 });
diff --git a/chrome/browser/resources/extensions/item.html b/chrome/browser/resources/extensions/item.html
index c4f300cf..b25e4a0a 100644
--- a/chrome/browser/resources/extensions/item.html
+++ b/chrome/browser/resources/extensions/item.html
@@ -299,13 +299,14 @@
           aria-label="$i18n{itemReload}" aria-describedby="a11yAssociation"
           on-click="onReloadTap_"></cr-icon-button>
     </template>
-    <template is="dom-if" if="[[data.disableReasons.corruptInstall]]">
+    <template is="dom-if"
+        if="[[showRepairButton_(data.disableReasons.corruptInstall)]]">
       <cr-button id="repair-button" class="action-button"
           aria-describedby="a11yAssociation" on-click="onRepairTap_">
         $i18n{itemRepair}
       </cr-button>
     </template>
-    <template is="dom-if" if="[[isTerminated_(data.state)]]">
+    <template is="dom-if" if="[[showReloadButton_(data.state)]]">
       <cr-button id="terminated-reload-button" on-click="onReloadTap_"
           aria-describedby="a11yAssociation" class="action-button">
         $i18n{itemReload}
@@ -317,9 +318,16 @@
             '$i18nPolymer{appEnabled}',
             '$i18nPolymer{extensionEnabled}')]]"
         aria-describedby="a11yAssociation"
-        checked="[[isEnabled_(data.state)]]" on-change="onEnableChange_"
+        checked="[[isEnabled_(data.state)]]"
+        on-change="onEnableToggleChange_"
         disabled="[[!isEnableToggleEnabled_(data.*)]]"
         hidden$="[[!showEnableToggle_(data.*)]]">
     </cr-toggle>
+    <cr-button id="enableButton"
+        on-click="onEnableButtonClick_"
+        aria-describedby="a11yAssociation"
+        hidden$="[[!showEnableButton_(data.*)]]">
+      $i18n{enableButton}
+    </cr-button>
   </div>
 </div>
diff --git a/chrome/browser/resources/extensions/item.js b/chrome/browser/resources/extensions/item.js
index 1795f59c..fd2301a 100644
--- a/chrome/browser/resources/extensions/item.js
+++ b/chrome/browser/resources/extensions/item.js
@@ -26,7 +26,7 @@
 import {flush, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ItemBehavior} from './item_behavior.js';
-import {computeInspectableViewLabel, getItemSource, getItemSourceString, isControlled, isEnabled, SourceType, userCanChangeEnablement} from './item_util.js';
+import {computeInspectableViewLabel, EnableControl, getEnableControl, getItemSource, getItemSourceString, isControlled, isEnabled, SourceType, userCanChangeEnablement} from './item_util.js';
 import {navigation, Page} from './navigation_helper.js';
 
 /** @interface */
@@ -205,11 +205,16 @@
   },
 
   /** @private */
-  onEnableChange_: function() {
+  onEnableToggleChange_: function() {
     this.delegate.setItemEnabled(this.data.id, this.$.enableToggle.checked);
   },
 
   /** @private */
+  onEnableButtonClick_: function() {
+    this.delegate.setItemEnabled(this.data.id, true);
+  },
+
+  /** @private */
   onErrorsTap_: function() {
     if (this.data.installWarnings && this.data.installWarnings.length > 0) {
       this.fire('show-install-warnings', this.data.installWarnings);
@@ -295,22 +300,40 @@
   },
 
   /**
+   * Returns true if the reload button should be shown.
+   * @return {boolean}
+   * @private
+   */
+  showReloadButton_: function() {
+    return getEnableControl(this.data) === EnableControl.RELOAD;
+  },
+
+  /**
+   * Returns true if the repair button should be shown.
+   * @return {boolean}
+   * @private
+   */
+  showRepairButton_: function() {
+    return getEnableControl(this.data) === EnableControl.REPAIR;
+  },
+
+
+  /**
    * Returns true if the enable toggle should be shown.
    * @return {boolean}
    * @private
    */
   showEnableToggle_: function() {
-    return !this.isTerminated_() && !this.data.disableReasons.corruptInstall;
+    return getEnableControl(this.data) === EnableControl.ENABLE_TOGGLE;
   },
 
   /**
-   * Returns true if the extension is in the terminated state.
+   * Returns true if the enable button should be shown.
    * @return {boolean}
    * @private
    */
-  isTerminated_: function() {
-    return this.data.state ===
-        chrome.developerPrivate.ExtensionState.TERMINATED;
+  showEnableButton_: function() {
+    return getEnableControl(this.data) === EnableControl.ENABLE_BUTTON;
   },
 
   /**
diff --git a/chrome/browser/resources/extensions/item_util.js b/chrome/browser/resources/extensions/item_util.js
index 31ffa06..d587ec0e 100644
--- a/chrome/browser/resources/extensions/item_util.js
+++ b/chrome/browser/resources/extensions/item_util.js
@@ -18,6 +18,14 @@
   UNKNOWN: 'unknown',
 };
 
+/** @enum {string} */
+export const EnableControl = {
+  RELOAD: 'RELOAD',
+  REPAIR: 'REPAIR',
+  ENABLE_BUTTON: 'ENABLE_BUTTON',
+  ENABLE_TOGGLE: 'ENABLE_TOGGLE',
+};
+
 /**
  * Returns true if the extension is enabled, including terminated
  * extensions.
@@ -151,3 +159,31 @@
 
   return label;
 }
+
+/**
+ * Returns true if the extension is in the terminated state.
+ * @param {!chrome.developerPrivate.ExtensionState} state
+ * @return {boolean}
+ * @private
+ */
+function isTerminated_(state) {
+  return state === chrome.developerPrivate.ExtensionState.TERMINATED;
+}
+
+/**
+ * Determines which enable control to display for a given extension.
+ * @param {!chrome.developerPrivate.ExtensionInfo} data
+ * @return {EnableControl}
+ */
+export function getEnableControl(data) {
+  if (isTerminated_(data.state)) {
+    return EnableControl.RELOAD;
+  }
+  if (data.disableReasons.corruptInstall) {
+    return EnableControl.REPAIR;
+  }
+  if (data.disableReasons.custodianApprovalRequired) {
+    return EnableControl.ENABLE_BUTTON;
+  }
+  return EnableControl.ENABLE_TOGGLE;
+}
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 1e7f5c5..2be519c2 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -107,7 +107,6 @@
   if (is_chromeos) {
     deps += [
       "chromeos:closure_compile",
-      "multidevice_page:closure_compile",
       "parental_controls_page:closure_compile",
     ]
   }
@@ -121,7 +120,6 @@
     ":open_window_proxy",
     ":page_visibility",
     ":route",
-    ":route_origin_behavior",
     ":search_settings",
   ]
 }
@@ -154,13 +152,6 @@
   ]
 }
 
-js_library("route_origin_behavior") {
-  deps = [
-    ":route",
-    "//ui/webui/resources/js:cr",
-  ]
-}
-
 js_library("route") {
   deps = [
     ":page_visibility",
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 6c864f1..494fd16 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -73,6 +73,7 @@
 group("closure_compile") {
   deps = [
     ":os_page_visibility",
+    ":route_origin_behavior",
     "bluetooth_page:closure_compile",
     "crostini_page:closure_compile",
     "date_time_page:closure_compile",
@@ -104,3 +105,10 @@
     "//ui/webui/resources/js:load_time_data",
   ]
 }
+
+js_library("route_origin_behavior") {
+  deps = [
+    "..:route",
+    "//ui/webui/resources/js:cr",
+  ]
+}
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
index 6ca3753..e0c4211 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
@@ -70,8 +70,8 @@
 js_library("crostini_subpage") {
   deps = [
     ":crostini_browser_proxy",
+    "..:route_origin_behavior",
     "../..:route",
-    "../..:route_origin_behavior",
     "../../prefs:prefs_behavior",
   ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.html b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.html
index 73a52f7..ffed0b25 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.html
@@ -7,7 +7,7 @@
 <link rel="import" href="../../i18n_setup.html">
 <link rel="import" href="../../prefs/prefs_behavior.html">
 <link rel="import" href="../../route.html">
-<link rel="import" href="../../route_origin_behavior.html">
+<link rel="import" href="../route_origin_behavior.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="../../settings_shared_css.html">
 
diff --git a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
index edb06a2d..37deea7 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
@@ -141,8 +141,8 @@
 
 js_library("storage") {
   deps = [
+    "..:route_origin_behavior",
     "../..:route",
-    "../..:route_origin_behavior",
     "../localized_link:localized_link",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data",
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage.html b/chrome/browser/resources/settings/chromeos/device_page/storage.html
index a1287336..eb4dd1ab 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/storage.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/storage.html
@@ -9,9 +9,9 @@
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="storage_external.html">
+<link rel="import" href="../route_origin_behavior.html">
 <link rel="import" href="../../prefs/prefs.html">
 <link rel="import" href="../../route.html">
-<link rel="import" href="../../route_origin_behavior.html">
 <link rel="import" href="../../settings_shared_css.html">
 
 <dom-module id="settings-storage">
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
index fe3ca6e..529294c0 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -90,8 +90,8 @@
 js_library("internet_subpage") {
   deps = [
     ":internet_page_browser_proxy",
+    "..:route_origin_behavior",
     "../..:route",
-    "../..:route_origin_behavior",
     "../localized_link:localized_link",
     "//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior",
     "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html
index 49bf29bc..3952339b 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html
@@ -16,7 +16,7 @@
 <link rel="import" href="../../chromeos/os_settings_icons_css.html">
 <link rel="import" href="../../i18n_setup.html">
 <link rel="import" href="../../route.html">
-<link rel="import" href="../../route_origin_behavior.html">
+<link rel="import" href="../route_origin_behavior.html">
 <link rel="import" href="../../settings_shared_css.html">
 
 <dom-module id="settings-internet-subpage">
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
index bb8a491..4e18ec16 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -16,9 +16,22 @@
   ]
 }
 
+js_library("multidevice_browser_proxy") {
+  deps = [
+    ":multidevice_constants",
+    "//ui/webui/resources/js:cr",
+  ]
+}
+
+js_library("multidevice_constants") {
+  deps = [
+    "//ui/webui/resources/js:cr",
+  ]
+}
+
 js_library("multidevice_feature_behavior") {
   deps = [
-    "../../multidevice_page:multidevice_constants",
+    ":multidevice_constants",
     "//ui/webui/resources/js:cr",
     "//ui/webui/resources/js:i18n_behavior",
   ]
@@ -27,9 +40,9 @@
 js_library("multidevice_feature_item") {
   deps = [
     ":multidevice_feature_behavior",
+    ":multidevice_page:multidevice_constants",
+    "..:route_origin_behavior",
     "../..:route",
-    "../..:route_origin_behavior",
-    "../../multidevice_page:multidevice_constants",
     "../localized_link:localized_link",
     "//ui/webui/resources/js:cr",
   ]
@@ -37,18 +50,18 @@
 
 js_library("multidevice_feature_toggle") {
   deps = [
+    ":multidevice_constants",
     ":multidevice_feature_behavior",
-    "../../multidevice_page:multidevice_constants",
   ]
 }
 
 js_library("multidevice_page") {
   deps = [
+    ":multidevice_browser_proxy",
+    ":multidevice_constants",
     ":multidevice_feature_behavior",
     "../..:route",
     "../../controls:password_prompt_dialog",
-    "../../multidevice_page:multidevice_browser_proxy",
-    "../../multidevice_page:multidevice_constants",
     "../localized_link:localized_link",
     "//ui/webui/resources/js:cr",
     "//ui/webui/resources/js:web_ui_listener_behavior",
@@ -65,8 +78,8 @@
 
 js_library("multidevice_smartlock_subpage") {
   deps = [
+    ":multidevice_constants",
     ":multidevice_feature_behavior",
-    "../../multidevice_page:multidevice_constants",
     "../../prefs:prefs_behavior",
     "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button",
     "//ui/webui/resources/js:cr",
@@ -75,9 +88,9 @@
 
 js_library("multidevice_subpage") {
   deps = [
+    ":multidevice_constants",
     ":multidevice_feature_behavior",
     "../..:route",
-    "../../multidevice_page:multidevice_constants",
     "//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior",
   ]
   externs_list = [ "$externs_path/networking_private.js" ]
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.html
similarity index 100%
rename from chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.html
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.html
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.js
similarity index 100%
rename from chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.js
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_constants.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_constants.html
similarity index 100%
rename from chrome/browser/resources/settings/multidevice_page/multidevice_constants.html
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_constants.html
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_constants.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_constants.js
similarity index 100%
rename from chrome/browser/resources/settings/multidevice_page/multidevice_constants.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_constants.js
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.html
index 83f5f34..e1dc076 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.html
@@ -1,7 +1,7 @@
 <link rel="import" href="chrome://resources/html/cr.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="multidevice_constants.html">
 <!-- Anyone using this behavior might be using the referenced icons. -->
 <link rel="import" href="../os_icons.html">
 <link rel="import" href="../../i18n_setup.html">
-<link rel="import" href="../../multidevice_page/multidevice_constants.html">
 <script src="multidevice_feature_behavior.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html
index ad3cf08..3fbb1b3 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html
@@ -6,10 +6,10 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="../../icons.html">
 <link rel="import" href="../../route.html">
-<link rel="import" href="../../route_origin_behavior.html">
 <link rel="import" href="../../settings_shared_css.html">
-<link rel="import" href="../../multidevice_page/multidevice_constants.html">
 <link rel="import" href="../localized_link/localized_link.html">
+<link rel="import" href="../route_origin_behavior.html">
+<link rel="import" href="multidevice_constants.html">
 <link rel="import" href="multidevice_feature_behavior.html">
 <link rel="import" href="multidevice_feature_toggle.html">
 
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.html
index debcc73..79ac7d5 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.html
@@ -1,8 +1,8 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
-<link rel="import" href="../../multidevice_page/multidevice_browser_proxy.html">
-<link rel="import" href="../../multidevice_page/multidevice_constants.html">
+<link rel="import" href="multidevice_browser_proxy.html">
+<link rel="import" href="multidevice_constants.html">
 <link rel="import" href="multidevice_feature_behavior.html">
 
 <dom-module id="settings-multidevice-feature-toggle">
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
index 49cfa8e8..ad70c77 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
@@ -14,9 +14,9 @@
 <link rel="import" href="../../settings_page/settings_animated_pages.html">
 <link rel="import" href="../../settings_page/settings_subpage.html">
 <link rel="import" href="../../settings_shared_css.html">
-<link rel="import" href="../../multidevice_page/multidevice_browser_proxy.html">
-<link rel="import" href="../../multidevice_page/multidevice_constants.html">
 <link rel="import" href="../localized_link/localized_link.html">
+<link rel="import" href="multidevice_browser_proxy.html">
+<link rel="import" href="multidevice_constants.html">
 <link rel="import" href="multidevice_feature_behavior.html">
 <link rel="import" href="multidevice_feature_toggle.html">
 <link rel="import" href="multidevice_smartlock_subpage.html">
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html
index 9db4b63..506c22f 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html
@@ -3,8 +3,8 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_radio_button/cr_radio_button.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_radio_group/cr_radio_group.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
-<link rel="import" href="../../multidevice_page/multidevice_constants.html">
-<link rel="import" href="../../multidevice_page/multidevice_browser_proxy.html">
+<link rel="import" href="multidevice_browser_proxy.html">
+<link rel="import" href="multidevice_constants.html">
 <link rel="import" href="multidevice_feature_behavior.html">
 <link rel="import" href="multidevice_feature_toggle.html">
 <link rel="import" href="multidevice_radio_button.html">
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html
index ebeb4c38..2e474e76 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html
@@ -10,7 +10,7 @@
 <link rel="import" href="../../route.html">
 <link rel="import" href="../../settings_shared_css.html">
 <link rel="import" href="../../settings_vars_css.html">
-<link rel="import" href="../../multidevice_page/multidevice_constants.html">
+<link rel="import" href="multidevice_constants.html">
 <link rel="import" href="multidevice_feature_behavior.html">
 <link rel="import" href="multidevice_feature_item.html">
 <link rel="import" href="multidevice_feature_toggle.html">
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
index a5becb3..507b216 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -27,8 +27,8 @@
 
 js_library("manage_a11y_page") {
   deps = [
+    "..:route_origin_behavior",
     "../..:route",
-    "../..:route_origin_behavior",
     "../device_page:device_page_browser_proxy",
     "//ui/webui/resources/js:load_time_data",
     "//ui/webui/resources/js:web_ui_listener_behavior",
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
index 86fbe2fa..f128fd7d 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
@@ -9,10 +9,10 @@
 <link rel="import" href="../../controls/settings_toggle_button.html">
 <link rel="import" href="../../i18n_setup.html">
 <link rel="import" href="../../route.html">
-<link rel="import" href="../../route_origin_behavior.html">
 <link rel="import" href="../../settings_shared_css.html">
 <link rel="import" href="../device_page/device_page_browser_proxy.html">
 <link rel="import" href="../localized_link/localized_link.html">
+<link rel="import" href="../route_origin_behavior.html">
 
 <dom-module id="settings-manage-a11y-page">
   <template>
@@ -118,8 +118,8 @@
     </cr-link-row>
     <cr-link-row id="appearanceSubpageButton" class="hr"
         label="$i18n{appearanceSettingsTitle}" on-click="onAppearanceTap_"
-        sub-label="$i18n{appearanceSettingsDescription}"
-        external="[[isOSSettings_]]" embedded></cr-link-row>
+        sub-label="$i18n{appearanceSettingsDescription}" external
+        embedded></cr-link-row>
 
     <h2>$i18n{keyboardAndTextInputHeading}</h2>
     <settings-toggle-button class="first"
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index 3d18f2a..3b40526 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -115,18 +115,6 @@
     },
 
     /**
-     * Whether this page shown as part of OS settings.
-     * TODO(crbug.com/986596): Remove this when SplitSettings is the default.
-     * @private
-     */
-    isOSSettings_: {
-      type: Boolean,
-      value: function() {
-        return loadTimeData.getBoolean('isOSSettings');
-      },
-    },
-
-    /**
      * |hasKeyboard_|, |hasMouse_|, and |hasTouchpad_| start undefined so
      * observers don't trigger until they have been populated.
      * @private
@@ -256,16 +244,8 @@
 
   /** @private */
   onAppearanceTap_: function() {
-    if (loadTimeData.getBoolean('isOSSettings')) {
-      // Open browser appearance section in a new browser tab.
-      window.open('chrome://settings/appearance');
-    } else {
-      // Open browser appearance in this settings window.
-      // TODO(crbug.com/986596): Remove this when SplitSettings is the default.
-      settings.navigateTo(
-          settings.routes.APPEARANCE,
-          /* dynamicParams */ null, /* removeSearch */ true);
-    }
+    // Open browser appearance section in a new browser tab.
+    window.open('chrome://settings/appearance');
   },
 
   /** @private */
diff --git a/chrome/browser/resources/settings/route_origin_behavior.html b/chrome/browser/resources/settings/chromeos/route_origin_behavior.html
similarity index 73%
rename from chrome/browser/resources/settings/route_origin_behavior.html
rename to chrome/browser/resources/settings/chromeos/route_origin_behavior.html
index ebd362d..faa4397 100644
--- a/chrome/browser/resources/settings/route_origin_behavior.html
+++ b/chrome/browser/resources/settings/chromeos/route_origin_behavior.html
@@ -1,3 +1,3 @@
 <link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="route.html">
+<link rel="import" href="../route.html">
 <script src="route_origin_behavior.js"></script>
diff --git a/chrome/browser/resources/settings/route_origin_behavior.js b/chrome/browser/resources/settings/chromeos/route_origin_behavior.js
similarity index 100%
rename from chrome/browser/resources/settings/route_origin_behavior.js
rename to chrome/browser/resources/settings/chromeos/route_origin_behavior.js
diff --git a/chrome/browser/resources/settings/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/multidevice_page/BUILD.gn
deleted file mode 100644
index ec98089..0000000
--- a/chrome/browser/resources/settings/multidevice_page/BUILD.gn
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-# Note: This file is not chromeos only because multidevice_browser_proxy is
-# required by site_settings:site_list.
-
-js_type_check("closure_compile") {
-  deps = [
-    ":multidevice_browser_proxy",
-    ":multidevice_constants",
-  ]
-}
-
-js_library("multidevice_browser_proxy") {
-  deps = [
-    ":multidevice_constants",
-    "//ui/webui/resources/js:cr",
-  ]
-}
-
-js_library("multidevice_constants") {
-  deps = [
-    "//ui/webui/resources/js:cr",
-  ]
-}
diff --git a/chrome/browser/resources/settings/multidevice_page/OWNERS b/chrome/browser/resources/settings/multidevice_page/OWNERS
deleted file mode 100644
index 8eaf92b2..0000000
--- a/chrome/browser/resources/settings/multidevice_page/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-file://chromeos/components/multidevice/OWNERS
-
-# COMPONENT: OS>Systems>Multidevice
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index 8f6cf312..519f15f2 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -762,11 +762,11 @@
                  file="route.js"
                  type="chrome_html"
                  preprocess="true" />
-      <structure name="IDR_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_HTML"
-                 file="route_origin_behavior.html"
+      <structure name="IDR_OS_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_HTML"
+                 file="chromeos/route_origin_behavior.html"
                  type="chrome_html" />
-      <structure name="IDR_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_JS"
-                 file="route_origin_behavior.js"
+      <structure name="IDR_OS_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_JS"
+                 file="chromeos/route_origin_behavior.js"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_JS"
                  file="search_engines_page/search_engines_browser_proxy.js"
@@ -978,16 +978,16 @@
                  file="chromeos/internet_page/internet_subpage.js"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_MULTIDEVICE_BROWSER_PROXY_HTML"
-                 file="multidevice_page/multidevice_browser_proxy.html"
+                 file="chromeos/multidevice_page/multidevice_browser_proxy.html"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_MULTIDEVICE_BROWSER_PROXY_JS"
-                 file="multidevice_page/multidevice_browser_proxy.js"
+                 file="chromeos/multidevice_page/multidevice_browser_proxy.js"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_MULTIDEVICE_CONSTANTS_HTML"
-                 file="multidevice_page/multidevice_constants.html"
+                 file="chromeos/multidevice_page/multidevice_constants.html"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_MULTIDEVICE_CONSTANTS_JS"
-                 file="multidevice_page/multidevice_constants.js"
+                 file="chromeos/multidevice_page/multidevice_constants.js"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_BEHAVIOR_HTML"
                  file="chromeos/multidevice_page/multidevice_feature_behavior.html"
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index ea273e7e..7a85639 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -473,16 +473,6 @@
       r.FINGERPRINT = r.LOCK_SCREEN.createChild('/lockScreen/fingerprint');
     }
 
-    // Show Android Apps page in the browser if split settings is turned off.
-    if (!loadTimeData.getBoolean('isOSSettings') &&
-        loadTimeData.getBoolean('showOSSettings') &&
-        loadTimeData.valueExists('androidAppsVisible') &&
-        loadTimeData.getBoolean('androidAppsVisible')) {
-      r.ANDROID_APPS = r.BASIC.createSection('/androidApps', 'androidApps');
-      r.ANDROID_APPS_DETAILS =
-          r.ANDROID_APPS.createChild('/androidApps/details');
-    }
-
     if (loadTimeData.valueExists('showCrostini') &&
         loadTimeData.getBoolean('showCrostini')) {
       r.CROSTINI = r.BASIC.createSection('/crostini', 'crostini');
@@ -509,91 +499,56 @@
 
     r.GOOGLE_ASSISTANT = r.SEARCH.createChild('/googleAssistant');
 
-    // This if/else accounts for sections that were added or refactored in
-    // the settings split (crbug.com/950007) and some routes that were created
-    // in browser settings conditioned on the pageVisibility constant, which is
-    // being decoupled from OS Settings in the split. The 'else' block provides
-    // a section-by-section comparison.
-    // TODO (crbug.com/967861): Make 'if' block unconditional. Remove 'else'
-    // block.
-    if (loadTimeData.getBoolean('isOSSettings')) {
-      r.ADVANCED = new Route('/advanced');
+    r.ADVANCED = new Route('/advanced');
 
-      r.PRIVACY = r.ADVANCED.createSection('/privacy', 'privacy');
+    r.PRIVACY = r.ADVANCED.createSection('/privacy', 'privacy');
 
-      // Languages and input
-      r.LANGUAGES = r.ADVANCED.createSection('/languages', 'languages');
-      r.LANGUAGES_DETAILS = r.LANGUAGES.createChild('/languages/details');
-      r.INPUT_METHODS =
-          r.LANGUAGES_DETAILS.createChild('/languages/inputMethods');
+    // Languages and input
+    r.LANGUAGES = r.ADVANCED.createSection('/languages', 'languages');
+    r.LANGUAGES_DETAILS = r.LANGUAGES.createChild('/languages/details');
+    r.INPUT_METHODS =
+        r.LANGUAGES_DETAILS.createChild('/languages/inputMethods');
 
-      r.PRINTING = r.ADVANCED.createSection('/printing', 'printing');
+    r.PRINTING = r.ADVANCED.createSection('/printing', 'printing');
 
-      r.ACCESSIBILITY = r.ADVANCED.createSection('/accessibility', 'a11y');
+    r.ACCESSIBILITY = r.ADVANCED.createSection('/accessibility', 'a11y');
 
-      if (!loadTimeData.getBoolean('isGuest')) {
-        if (loadTimeData.valueExists('splitSettingsSyncEnabled') &&
-            loadTimeData.getBoolean('splitSettingsSyncEnabled')) {
-          r.OS_SYNC = r.PEOPLE.createChild('/osSync');
-        }
-        // Personalization
-        r.PERSONALIZATION =
-            r.BASIC.createSection('/personalization', 'personalization');
-        r.CHANGE_PICTURE = r.PERSONALIZATION.createChild('/changePicture');
-
-        // Files (analogous to Downloads)
-        r.FILES = r.ADVANCED.createSection('/files', 'files');
-        r.SMB_SHARES = r.FILES.createChild('/smbShares');
+    if (!loadTimeData.getBoolean('isGuest')) {
+      if (loadTimeData.valueExists('splitSettingsSyncEnabled') &&
+          loadTimeData.getBoolean('splitSettingsSyncEnabled')) {
+        r.OS_SYNC = r.PEOPLE.createChild('/osSync');
       }
+      // Personalization
+      r.PERSONALIZATION =
+          r.BASIC.createSection('/personalization', 'personalization');
+      r.CHANGE_PICTURE = r.PERSONALIZATION.createChild('/changePicture');
 
-      // Reset
-      if (loadTimeData.valueExists('allowPowerwash') &&
-          loadTimeData.getBoolean('allowPowerwash')) {
-        r.RESET = r.ADVANCED.createSection('/reset', 'reset');
+      // Files (analogous to Downloads)
+      r.FILES = r.ADVANCED.createSection('/files', 'files');
+      r.SMB_SHARES = r.FILES.createChild('/smbShares');
+    }
+
+    // Reset
+    if (loadTimeData.valueExists('allowPowerwash') &&
+        loadTimeData.getBoolean('allowPowerwash')) {
+      r.RESET = r.ADVANCED.createSection('/reset', 'reset');
+    }
+
+    const showAppManagement = loadTimeData.valueExists('showAppManagement') &&
+        loadTimeData.getBoolean('showAppManagement');
+    const showAndroidApps = loadTimeData.valueExists('androidAppsVisible') &&
+        loadTimeData.getBoolean('androidAppsVisible');
+    // Apps
+    if (showAppManagement || showAndroidApps) {
+      r.APPS = r.BASIC.createSection('/apps', 'apps');
+      if (showAppManagement) {
+        r.APP_MANAGEMENT = r.APPS.createChild('/app-management');
+        r.APP_MANAGEMENT_DETAIL =
+            r.APP_MANAGEMENT.createChild('/app-management/detail');
       }
-
-      const showAppManagement = loadTimeData.valueExists('showAppManagement') &&
-          loadTimeData.getBoolean('showAppManagement');
-      const showAndroidApps = loadTimeData.valueExists('androidAppsVisible') &&
-          loadTimeData.getBoolean('androidAppsVisible');
-      // Apps
-      if (showAppManagement || showAndroidApps) {
-        r.APPS = r.BASIC.createSection('/apps', 'apps');
-        if (showAppManagement) {
-          r.APP_MANAGEMENT = r.APPS.createChild('/app-management');
-          r.APP_MANAGEMENT_DETAIL =
-              r.APP_MANAGEMENT.createChild('/app-management/detail');
-        }
-        if (showAndroidApps) {
-          r.ANDROID_APPS_DETAILS = r.APPS.createChild('/androidAppsDetails');
-        }
+      if (showAndroidApps) {
+        r.ANDROID_APPS_DETAILS = r.APPS.createChild('/androidAppsDetails');
       }
-    } else {
-      assert(r.ADVANCED, 'ADVANCED route should exist');
-
-      assert(r.PRIVACY, 'PRIVACY route should exist');
-
-      // Languages and input
-      assert(r.LANGUAGES, 'LANGUAGES route should exist');
-      r.INPUT_METHODS = r.LANGUAGES.createChild('/inputMethods');
-
-      assert(r.PRINTING, 'PRINTING route should exist');
-
-      assert(r.ACCESSIBILITY, 'ACCESSIBILITY route should exist');
-
-      if (!loadTimeData.getBoolean('isGuest')) {
-        // People
-        r.CHANGE_PICTURE = r.PEOPLE.createChild('/changePicture');
-
-        // Downloads (analogous to Files)
-        assert(r.DOWNLOADS, 'DOWNLOADS route should exist');
-        r.SMB_SHARES = r.DOWNLOADS.createChild('/smbShares');
-
-        // Reset
-        assert(r.RESET, 'RESET route should exist');
-      }
-
-      assert(!r.APPS, 'APPS route should not exist');
     }
 
     r.DATETIME = r.ADVANCED.createSection('/dateTime', 'dateTime');
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index b527c97..152d81e0 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -21,7 +21,7 @@
                  type="chrome_html"
                  preprocess="true" />
 
-      <if expr="not is_macosx and not is_chromeos">
+      <if expr="not is_macosx and not chromeos">
         <structure name="IDR_SETTINGS_CAPTIONS_SUBPAGE_HTML"
                    file="a11y_page/captions_subpage.html"
                    type="chrome_html" />
@@ -865,20 +865,20 @@
                  file="route.js"
                  type="chrome_html"
                  preprocess="true" />
-      <if expr="chromeos">
-        <structure name="IDR_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_HTML"
-                   file="route_origin_behavior.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_JS"
-                   file="route_origin_behavior.js"
-                   type="chrome_html" />
-      </if>
       <structure name="IDR_SETTINGS_SITE_FAVICON_HTML"
                  file="site_favicon.html"
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_SITE_FAVICON_JS"
                  file="site_favicon.js"
                  type="chrome_html" />
+      <if expr="chromeos">
+        <structure name="IDR_SETTINGS_ANDROID_INFO_BROWSER_PROXY_HTML"
+                   file="site_settings/android_info_browser_proxy.html"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_ANDROID_INFO_BROWSER_PROXY_JS"
+                   file="site_settings/android_info_browser_proxy.js"
+                   type="chrome_html" />
+      </if>
       <structure name="IDR_SETTINGS_SITE_DATA_HTML"
                  file="site_settings/site_data.html"
                  type="chrome_html" />
@@ -1056,26 +1056,6 @@
                  file="site_settings/zoom_levels.js"
                  type="chrome_html" />
       <if expr="chromeos">
-        <structure name="IDR_SETTINGS_ANDROID_APPS_BROWSER_PROXY_JS"
-                   file="chromeos/os_apps_page/android_apps_browser_proxy.js"
-                   type="chrome_html"
-                   preprocess="true" />
-        <structure name="IDR_SETTINGS_ANDROID_APPS_BROWSER_PROXY_HTML"
-                   file="chromeos/os_apps_page/android_apps_browser_proxy.html"
-                   type="chrome_html"
-                   preprocess="true" />
-        <structure name="IDR_SETTINGS_MULTIDEVICE_BROWSER_PROXY_HTML"
-                   file="multidevice_page/multidevice_browser_proxy.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_MULTIDEVICE_BROWSER_PROXY_JS"
-                   file="multidevice_page/multidevice_browser_proxy.js"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_MULTIDEVICE_CONSTANTS_HTML"
-                   file="multidevice_page/multidevice_constants.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_MULTIDEVICE_CONSTANTS_JS"
-                   file="multidevice_page/multidevice_constants.js"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_PARENTAL_CONTROLS_BROWSER_PROXY_HTML"
                    file="parental_controls_page/parental_controls_browser_proxy.html"
                    type="chrome_html" />
diff --git a/chrome/browser/resources/settings/site_settings/BUILD.gn b/chrome/browser/resources/settings/site_settings/BUILD.gn
index d3a60ae..24113bc 100644
--- a/chrome/browser/resources/settings/site_settings/BUILD.gn
+++ b/chrome/browser/resources/settings/site_settings/BUILD.gn
@@ -54,6 +54,13 @@
   externs_list = [ "$externs_path/settings_private.js" ]
 }
 
+js_library("android_info_browser_proxy") {
+  deps = [
+    "//ui/webui/resources/js:cr",
+  ]
+  externs_list = [ "$externs_path/chrome_send.js" ]
+}
+
 js_library("category_default_setting") {
   deps = [
     ":constants",
@@ -134,7 +141,7 @@
     ":site_settings_behavior",
 
     # Must be included on all platforms to satisfy closure compiler.
-    "../chromeos/os_apps_page:android_apps_browser_proxy",
+    ":android_info_browser_proxy",
     "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
     "//ui/webui/resources/js:web_ui_listener_behavior",
   ]
@@ -223,10 +230,10 @@
 
 js_library("site_list") {
   deps = [
+    ":android_info_browser_proxy",
     ":constants",
     ":site_list_entry",
     ":site_settings_behavior",
-    "../multidevice_page:multidevice_browser_proxy",
     "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr",
diff --git a/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.html b/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.html
new file mode 100644
index 0000000..9be65b48
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.html
@@ -0,0 +1,2 @@
+<link rel="import" href="chrome://resources/html/cr.html">
+<script src="android_info_browser_proxy.js"></script>
diff --git a/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js b/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js
new file mode 100644
index 0000000..44ae82a
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js
@@ -0,0 +1,61 @@
+// Copyright 2019 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.
+
+/**
+ * Type definition of AndroidAppsInfo entry. |playStoreEnabled| indicates that
+ * Play Store is enabled. |settingsAppAvailable| indicates that Android settings
+ * app is registered in the system.
+ * @typedef {{
+ *   playStoreEnabled: boolean,
+ *   settingsAppAvailable: boolean,
+ * }}
+ * @see chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
+ */
+let AndroidAppsInfo;
+
+cr.define('settings', function() {
+  /**
+   * An object containing messages for web permissisions origin
+   * and the messages multidevice feature state.
+   *
+   * @typedef {{origin: string,
+   *            enabled: boolean}}
+   */
+  let AndroidSmsInfo;
+
+  /** @interface */
+  class AndroidInfoBrowserProxy {
+    /**
+     * Returns android messages info with messages feature state
+     * and messages for web permissions origin.
+     * @return {!Promise<!settings.AndroidSmsInfo>} Android SMS Info
+     */
+    getAndroidSmsInfo() {}
+
+    requestAndroidAppsInfo() {}
+  }
+
+  /**
+   * @implements {settings.AndroidInfoBrowserProxy}
+   */
+  class AndroidInfoBrowserProxyImpl {
+    /** @override */
+    getAndroidSmsInfo() {
+      return cr.sendWithPromise('getAndroidSmsInfo');
+    }
+
+    /** @override */
+    requestAndroidAppsInfo() {
+      chrome.send('requestAndroidAppsInfo');
+    }
+  }
+
+  cr.addSingletonGetter(AndroidInfoBrowserProxyImpl);
+
+  return {
+    AndroidInfoBrowserProxy: AndroidInfoBrowserProxy,
+    AndroidInfoBrowserProxyImpl: AndroidInfoBrowserProxyImpl,
+    AndroidSmsInfo: AndroidSmsInfo,
+  };
+});
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.html b/chrome/browser/resources/settings/site_settings/protocol_handlers.html
index b2003876..1e53c60 100644
--- a/chrome/browser/resources/settings/site_settings/protocol_handlers.html
+++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.html
@@ -13,7 +13,7 @@
 <link rel="import" href="site_settings_prefs_browser_proxy.html">
 
 <if expr="chromeos">
-<link rel="import" href="../chromeos/os_apps_page/android_apps_browser_proxy.html">
+<link rel="import" href="android_info_browser_proxy.html">
 </if>
 
 <dom-module id="protocol-handlers">
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.js b/chrome/browser/resources/settings/site_settings/protocol_handlers.js
index 6c8ee14..7bf31498 100644
--- a/chrome/browser/resources/settings/site_settings/protocol_handlers.js
+++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.js
@@ -92,7 +92,7 @@
   attached: function() {
     cr.addWebUIListener(
         'android-apps-info-update', this.androidAppsInfoUpdate_.bind(this));
-    settings.AndroidAppsBrowserProxyImpl.getInstance().requestAndroidAppsInfo();
+    settings.AndroidInfoBrowserProxyImpl.getInstance().requestAndroidAppsInfo();
   },
   // </if>
 
diff --git a/chrome/browser/resources/settings/site_settings/site_list.html b/chrome/browser/resources/settings/site_settings/site_list.html
index 3572499..02cb45c 100644
--- a/chrome/browser/resources/settings/site_settings/site_list.html
+++ b/chrome/browser/resources/settings/site_settings/site_list.html
@@ -19,7 +19,7 @@
 <link rel="import" href="site_settings_behavior.html">
 <link rel="import" href="site_settings_prefs_browser_proxy.html">
 <if expr="chromeos">
-  <link rel="import" href="../multidevice_page/multidevice_browser_proxy.html">
+  <link rel="import" href="android_info_browser_proxy.html">
 </if>
 
 <dom-module id="site-list">
diff --git a/chrome/browser/resources/settings/site_settings/site_list.js b/chrome/browser/resources/settings/site_settings/site_list.js
index bdc541b..b85a012 100644
--- a/chrome/browser/resources/settings/site_settings/site_list.js
+++ b/chrome/browser/resources/settings/site_settings/site_list.js
@@ -310,9 +310,9 @@
         loadTimeData.valueExists('multideviceAllowedByPolicy') &&
         loadTimeData.getBoolean('multideviceAllowedByPolicy') &&
         !this.androidSmsInfo_) {
-      const multideviceSetupProxy =
-          settings.MultiDeviceBrowserProxyImpl.getInstance();
-      return multideviceSetupProxy.getAndroidSmsInfo().then((info) => {
+      const androidInfoBrowserProxy =
+          settings.AndroidInfoBrowserProxyImpl.getInstance();
+      return androidInfoBrowserProxy.getAndroidSmsInfo().then((info) => {
         this.androidSmsInfo_ = info;
       });
     }
diff --git a/chrome/browser/settings/BUILD.gn b/chrome/browser/settings/BUILD.gn
index e5f8d341..a7607eb 100644
--- a/chrome/browser/settings/BUILD.gn
+++ b/chrome/browser/settings/BUILD.gn
@@ -10,8 +10,12 @@
     "android/java/src/org/chromium/chrome/browser/settings/ManagedPreferencesUtils.java",
     "android/java/src/org/chromium/chrome/browser/settings/SearchUtils.java",
     "android/java/src/org/chromium/chrome/browser/settings/SettingsUtils.java",
+    "android/widget/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java",
+    "android/widget/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java",
     "android/widget/java/src/org/chromium/chrome/browser/settings/ChromeBasePreference.java",
     "android/widget/java/src/org/chromium/chrome/browser/settings/ChromeImageViewPreference.java",
+    "android/widget/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java",
+    "android/widget/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java",
   ]
   deps = [
     ":java_resources",
diff --git a/chrome/android/java/res/layout/button_preference_button.xml b/chrome/browser/settings/android/java/res/layout/button_preference_button.xml
similarity index 100%
rename from chrome/android/java/res/layout/button_preference_button.xml
rename to chrome/browser/settings/android/java/res/layout/button_preference_button.xml
diff --git a/chrome/android/java/res/layout/button_preference_layout.xml b/chrome/browser/settings/android/java/res/layout/button_preference_layout.xml
similarity index 100%
rename from chrome/android/java/res/layout/button_preference_layout.xml
rename to chrome/browser/settings/android/java/res/layout/button_preference_layout.xml
diff --git a/chrome/android/java/res/values-sw720dp-v17/styles.xml b/chrome/browser/settings/android/java/res/values-sw720dp-v17/styles.xml
similarity index 100%
rename from chrome/android/java/res/values-sw720dp-v17/styles.xml
rename to chrome/browser/settings/android/java/res/values-sw720dp-v17/styles.xml
diff --git a/chrome/android/java/res/values-sw720dp-v21/styles.xml b/chrome/browser/settings/android/java/res/values-sw720dp-v21/styles.xml
similarity index 100%
rename from chrome/android/java/res/values-sw720dp-v21/styles.xml
rename to chrome/browser/settings/android/java/res/values-sw720dp-v21/styles.xml
diff --git a/chrome/browser/settings/android/java/res/values-v21/styles.xml b/chrome/browser/settings/android/java/res/values-v21/styles.xml
index 64e418d7..d15d9a4 100644
--- a/chrome/browser/settings/android/java/res/values-v21/styles.xml
+++ b/chrome/browser/settings/android/java/res/values-v21/styles.xml
@@ -28,4 +28,15 @@
     <style name="PreferenceSummary">
         <item name="android:textAppearance">@style/TextAppearance.BlackBody</item>
     </style>
+
+    <style name="PreferenceLayoutBase">
+        <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
+        <item name="android:minHeight">?android:attr/listPreferredItemHeightSmall</item>
+        <item name="android:paddingTop">16dp</item>
+        <item name="android:paddingBottom">16dp</item>
+        <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
+        <item name="android:paddingEnd">?android:attr/listPreferredItemPaddingEnd</item>
+    </style>
+
+    <style name="PreferenceLayout" parent="PreferenceLayoutBase" />
 </resources>
diff --git a/chrome/browser/settings/android/java/res/values/styles.xml b/chrome/browser/settings/android/java/res/values/styles.xml
index 91dca86..26f612d4 100644
--- a/chrome/browser/settings/android/java/res/values/styles.xml
+++ b/chrome/browser/settings/android/java/res/values/styles.xml
@@ -38,4 +38,15 @@
         <item name="android:textSize">18sp</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
+
+    <style name="PreferenceLayoutBase">
+        <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
+        <item name="android:minHeight">?android:attr/listPreferredItemHeight</item>
+        <item name="android:paddingTop">6dp</item>
+        <item name="android:paddingBottom">6dp</item>
+        <item name="android:paddingStart">8dp</item>
+        <item name="android:paddingEnd">8dp</item>
+    </style>
+
+    <style name="PreferenceLayout" parent="PreferenceLayoutBase" />
 </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java b/chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
rename to chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
index 409aa48..1ae1d33 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
+++ b/chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
@@ -10,8 +10,6 @@
 import android.util.AttributeSet;
 import android.widget.Button;
 
-import org.chromium.chrome.R;
-
 /**
  * A {@link Preference} that provides button functionality.
  *
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java b/chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java
rename to chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java b/chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java
rename to chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java b/chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java
rename to chrome/browser/settings/android/widget/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 9ffc63c6..d53115c8 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3839,8 +3839,8 @@
       "views/crostini/crostini_update_component_view.h",
       "views/crostini/crostini_update_filesystem_view.cc",
       "views/crostini/crostini_update_filesystem_view.h",
-      "views/plugin_vm/plugin_vm_launcher_view.cc",
-      "views/plugin_vm/plugin_vm_launcher_view.h",
+      "views/plugin_vm/plugin_vm_installer_view.cc",
+      "views/plugin_vm/plugin_vm_installer_view.h",
     ]
     deps += [
       # TODO(wutao): Put new icons resources to ash/public/cpp/vector_icons/
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
index 05161f0..5da17d2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Moenie weer wys nie</translation>
 <translation id="1692118695553449118">Sinkronisering is aan</translation>
 <translation id="169515064810179024">Blokkeer werwe om toegang tot bewegingsensors te kry</translation>
-<translation id="1711267867945983636">Skakel NFC op jou foon aan om voort te gaan</translation>
 <translation id="1717218214683051432">Bewegingsensors</translation>
 <translation id="1718835860248848330">Afgelope uur</translation>
 <translation id="1736419249208073774">Verken</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
index 185ff272..ff3fcc0 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">ዳግም አታሳይ</translation>
 <translation id="1692118695553449118">አመሳስል በርቷል</translation>
 <translation id="169515064810179024">ጣቢያዎች የእንቅስቃሴ ዳሳሾችን እንዳይደርሱ ያግዱ</translation>
-<translation id="1711267867945983636">ለመቀጠል በእርስዎ ስልክ ላይ NFCን ያብሩ</translation>
 <translation id="1717218214683051432">የእንቅስቃሴ ዳሳሾች</translation>
 <translation id="1718835860248848330">የመጨረሻው ሰዓት</translation>
 <translation id="1736419249208073774">አስስ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
index d426ab19..d26185c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">عدم العرض مرة أخرى</translation>
 <translation id="1692118695553449118">المزامنة ممكنة</translation>
 <translation id="169515064810179024">حظر مواقع الويب من الوصول إلى مستشعرات الحركة</translation>
-<translation id="1711267867945983636">‏للمتابعة، فعِّل ميزة NFC على هاتفك</translation>
 <translation id="1717218214683051432">مستشعرات الحركة</translation>
 <translation id="1718835860248848330">آخر ساعة</translation>
 <translation id="1736419249208073774">استكشاف</translation>
@@ -822,7 +821,7 @@
 <translation id="7180611975245234373">إعادة التحميل</translation>
 <translation id="7189372733857464326">‏انتظار انتهاء تحديث خدمات Google Play</translation>
 <translation id="7191430249889272776">تم فتح علامة التبويب في الخلفية.</translation>
-<translation id="723171743924126238">تحديد الصور</translation>
+<translation id="723171743924126238">اختيار الصور</translation>
 <translation id="7233236755231902816">‏للاطّلاع على الويب بلغتك، يمكنك الحصول على أحدث إصدار من Chrome.</translation>
 <translation id="7243308994586599757">الخيارات المتاحة بالقرب من الجزء السفلي من الشاشة</translation>
 <translation id="7248069434667874558">‏يُرجى التأكّد من تفعيل مزامنة <ph name="TARGET_DEVICE_NAME" /> في Chrome.</translation>
@@ -908,7 +907,7 @@
 <translation id="780301667611848630">لا، شكرًا</translation>
 <translation id="7810647596859435254">فتح باستخدام...</translation>
 <translation id="7821588508402923572">سيظهر توفير البيانات هنا</translation>
-<translation id="7846076177841592234">إلغاء التحديد</translation>
+<translation id="7846076177841592234">إلغاء الاختيار</translation>
 <translation id="784934925303690534">النطاق الزمني</translation>
 <translation id="7851858861565204677">أجهزة أخرى</translation>
 <translation id="7875915731392087153">إنشاء بريد إلكتروني</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
index e8360722..d483b0ab 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -92,7 +92,6 @@
 <translation id="1672586136351118594">পুনৰাই নেদেখুৱাব</translation>
 <translation id="1692118695553449118">ছিংক অন হৈ আছে</translation>
 <translation id="169515064810179024">ছাইটসমূহে ম'শ্বন ছেন্সৰসমূহ এক্সেছ কৰাটো অৱৰোধ কৰক</translation>
-<translation id="1711267867945983636">অব্যাহত ৰাখিবলৈ আপোনাৰ ফ’নত NFC অন কৰক</translation>
 <translation id="1717218214683051432">ম'শ্বন ছেন্সৰসমূহ</translation>
 <translation id="1718835860248848330">যোৱা ১ ঘণ্টাৰ</translation>
 <translation id="1736419249208073774">অন্বেষণ কৰক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
index b49ab79..f537626 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Daha göstərməyin</translation>
 <translation id="1692118695553449118">Sinxronizasiya aktivdir</translation>
 <translation id="169515064810179024">Saytların hərəkət sensorlarına girişini blok edin</translation>
-<translation id="1711267867945983636">Davam etmək üçün telefonunuzda NFC'ni aktiv edin</translation>
 <translation id="1717218214683051432">Hərəkət sensorları</translation>
 <translation id="1718835860248848330">Son saat</translation>
 <translation id="1736419249208073774">Araşdırın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
index 74140d0..acbd2921 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Больш не паказваць</translation>
 <translation id="1692118695553449118">Сінхранізацыя ўключана</translation>
 <translation id="169515064810179024">Заблакіраваць сайтам доступ да датчыкаў руху</translation>
-<translation id="1711267867945983636">Каб працягнуць, уключыце на тэлефоне функцыю NFC</translation>
 <translation id="1717218214683051432">Датчыкі руху</translation>
 <translation id="1718835860248848330">За апошнюю гадзіну</translation>
 <translation id="1736419249208073774">Агляд</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
index 742f927..3b92ad96 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Да не се показва отново</translation>
 <translation id="1692118695553449118">Синхронизирането е включено</translation>
 <translation id="169515064810179024">Блокиране на достъпа на сайтовете до сензорите за движение</translation>
-<translation id="1711267867945983636">За да продължите, включете NFC на телефона си</translation>
 <translation id="1717218214683051432">Сензори за движение</translation>
 <translation id="1718835860248848330">Последния час</translation>
 <translation id="1736419249208073774">Разглеждане</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
index 9e59dccd..b89c88f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">আর দেখতে চাই না</translation>
 <translation id="1692118695553449118">সিঙ্ক চালু রয়েছে</translation>
 <translation id="169515064810179024">মোশন সেন্সর অ্যাক্সেস করা থেকে সাইটকে ব্লক করুন</translation>
-<translation id="1711267867945983636">চালিয়ে যেতে, আপনার ফোনে NFC চালু করুন</translation>
 <translation id="1717218214683051432">মোশন সেন্সর</translation>
 <translation id="1718835860248848330">শেষ ঘণ্টা</translation>
 <translation id="1736419249208073774">ঘুরে দেখুন</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
index bbf43cb..bd5cdd2f134 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ne prikazuj ponovo</translation>
 <translation id="1692118695553449118">Sinhronizacija je uključena</translation>
 <translation id="169515064810179024">Blokiraj web lokacijama pristup senzorima pokreta</translation>
-<translation id="1711267867945983636">Da nastavite, uključite NFC na telefonu</translation>
 <translation id="1717218214683051432">Senzori pokreta</translation>
 <translation id="1718835860248848330">Posljednji sat</translation>
 <translation id="1736419249208073774">Istraži</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
index a8bfef18..5f7f27a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">No m'ho tornis a mostrar</translation>
 <translation id="1692118695553449118">La sincronització està activada</translation>
 <translation id="169515064810179024">Impedeix que els llocs web accedeixin als sensors de moviment</translation>
-<translation id="1711267867945983636">Per continuar, activa l'NFC al telèfon</translation>
 <translation id="1717218214683051432">Sensors de moviment</translation>
 <translation id="1718835860248848330">Darrera hora</translation>
 <translation id="1736419249208073774">Explora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
index 107fc289..12b3e58c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Tuto zprávu již nezobrazovat</translation>
 <translation id="1692118695553449118">Synchronizace je zapnuta</translation>
 <translation id="169515064810179024">Blokovat webům přístup k senzorům pohybu</translation>
-<translation id="1711267867945983636">Chcete-li pokračovat, zapněte v telefonu NFC</translation>
 <translation id="1717218214683051432">Pohybová čidla</translation>
 <translation id="1718835860248848330">Poslední hodina</translation>
 <translation id="1736419249208073774">Prozkoumat</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
index e248da7..ee21f79d 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Vis ikke igen</translation>
 <translation id="1692118695553449118">Synkronisering er slået til</translation>
 <translation id="169515064810179024">Bloker adgang til bevægelsessensorer på websites</translation>
-<translation id="1711267867945983636">Aktivér NFC på din telefon for at fortsætte</translation>
 <translation id="1717218214683051432">Bevægelsessensorer</translation>
 <translation id="1718835860248848330">Den seneste time</translation>
 <translation id="1736419249208073774">Mere</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
index b18f132..51d8bcab 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Nicht mehr anzeigen</translation>
 <translation id="1692118695553449118">Synchronisierung ist aktiviert</translation>
 <translation id="169515064810179024">Zugriff auf Bewegungssensoren für Websites blockieren</translation>
-<translation id="1711267867945983636">Aktivieren Sie NFC auf Ihrem Smartphone, um fortzufahren</translation>
 <translation id="1717218214683051432">Bewegungssensoren</translation>
 <translation id="1718835860248848330">Letzte Stunde</translation>
 <translation id="1736419249208073774">Entdecken</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
index 0e222477..bb9c6fd7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Να μην εμφανιστεί ξανά</translation>
 <translation id="1692118695553449118">Ο συγχρονισμός είναι ενεργοποιημένος</translation>
 <translation id="169515064810179024">Αποκλεισμός πρόσβασης σε αισθητήρες κίνησης από ιστοτόπους</translation>
-<translation id="1711267867945983636">Για να συνεχίσετε, ενεργοποιήστε το NFC στο τηλέφωνό σας.</translation>
 <translation id="1717218214683051432">Αισθητήρες κίνησης</translation>
 <translation id="1718835860248848330">Τελευταία ώρα</translation>
 <translation id="1736419249208073774">Εξερεύνηση</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
index c93f73e..1dcc6b2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Don‘t show again</translation>
 <translation id="1692118695553449118">Sync is on</translation>
 <translation id="169515064810179024">Block sites from accessing motion sensors</translation>
-<translation id="1711267867945983636">To continue, turn on NFC on your phone</translation>
 <translation id="1717218214683051432">Motion sensors</translation>
 <translation id="1718835860248848330">Last hour</translation>
 <translation id="1736419249208073774">Explore</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
index edeca2c..44b6669 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">No volver a mostrar</translation>
 <translation id="1692118695553449118">La sincronización está activada.</translation>
 <translation id="169515064810179024">Impedir que los sitios accedan a los sensores de movimiento</translation>
-<translation id="1711267867945983636">Para continuar, activa NFC en tu teléfono</translation>
 <translation id="1717218214683051432">Sensores de movimiento</translation>
 <translation id="1718835860248848330">Última hora</translation>
 <translation id="1736419249208073774">Explorar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
index a1476b5c..1928f7bf 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">No volver a mostrar</translation>
 <translation id="1692118695553449118">La sincronización está activada</translation>
 <translation id="169515064810179024">No permitir que los sitios web accedan a los sensores de movimiento</translation>
-<translation id="1711267867945983636">Para continuar, activa la tecnología NFC en el teléfono</translation>
 <translation id="1717218214683051432">Sensores de movimiento</translation>
 <translation id="1718835860248848330">Última hora</translation>
 <translation id="1736419249208073774">Más información</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
index 46bcf62..d13a16c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ära kuva uuesti</translation>
 <translation id="1692118695553449118">Sünkroonimine on sisse lülitatud</translation>
 <translation id="169515064810179024">Blokeeri saitide juurdepääs liikumisanduritele</translation>
-<translation id="1711267867945983636">Jätkamiseks lülitage NFC oma telefonis sisse</translation>
 <translation id="1717218214683051432">Liikumisandurid</translation>
 <translation id="1718835860248848330">Viimase tunni jooksul</translation>
 <translation id="1736419249208073774">Avastage</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
index 6325b7f..c3aacb6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ez erakutsi berriro</translation>
 <translation id="1692118695553449118">Sinkronizazioa aktibatuta dago</translation>
 <translation id="169515064810179024">Ez utzi webguneei mugimendu-sentsoreak atzitzen</translation>
-<translation id="1711267867945983636">Aurrera egiteko, aktibatu NFC aukera telefonoan</translation>
 <translation id="1717218214683051432">Mugimendu-sentsoreak</translation>
 <translation id="1718835860248848330">Azken ordukoak</translation>
 <translation id="1736419249208073774">Arakatu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
index d81ef041..4f2ba330 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">دیگر نشان داده نشود</translation>
 <translation id="1692118695553449118">همگام‌سازی روشن است</translation>
 <translation id="169515064810179024">سایت‌ها نمی‌توانند به حسگرهای حرکتی دسترسی داشته باشند</translation>
-<translation id="1711267867945983636">‏برای ادامه، NFC را در تلفن روشن کنید</translation>
 <translation id="1717218214683051432">حسگرهای حرکتی</translation>
 <translation id="1718835860248848330">ساعت قبل</translation>
 <translation id="1736419249208073774">کاوش</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
index c62fade..970ca6d 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Älä näytä uudelleen</translation>
 <translation id="1692118695553449118">Synkronointi on päällä</translation>
 <translation id="169515064810179024">Estä sivustoja käyttämästä liiketunnistimien lukemia</translation>
-<translation id="1711267867945983636">Laita NFC päälle puhelimella jatkaaksesi</translation>
 <translation id="1717218214683051432">Liiketunnistimet</translation>
 <translation id="1718835860248848330">Viimeinen tunti</translation>
 <translation id="1736419249208073774">Tutustu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
index 56843f65..1c99074 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Huwag ipakitang muli</translation>
 <translation id="1692118695553449118">Naka-on ang pag-sync</translation>
 <translation id="169515064810179024">I-block ang mga site sa pag-access sa mga sensor ng paggalaw</translation>
-<translation id="1711267867945983636">Para magpatuloy, i-on ang NFC sa iyong telepono</translation>
 <translation id="1717218214683051432">Mga sensor ng paggalaw</translation>
 <translation id="1718835860248848330">Huling oras</translation>
 <translation id="1736419249208073774">I-explore</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
index 86d20de..7a02511 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ne plus afficher</translation>
 <translation id="1692118695553449118">La synchronisation est activée</translation>
 <translation id="169515064810179024">Empêcher les sites d'accéder aux capteurs de mouvement</translation>
-<translation id="1711267867945983636">Pour continuer, activez la NFC sur votre téléphone</translation>
 <translation id="1717218214683051432">Capteurs de mouvements</translation>
 <translation id="1718835860248848330">Dernière heure</translation>
 <translation id="1736419249208073774">Explorer</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
index b990f2549..9420ada 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ne plus afficher</translation>
 <translation id="1692118695553449118">La synchronisation est activée.</translation>
 <translation id="169515064810179024">Empêcher les sites d'accéder aux capteurs de mouvement</translation>
-<translation id="1711267867945983636">Pour continuer, activez la fonctionnalité NFC sur votre téléphone</translation>
 <translation id="1717218214683051432">Capteurs de mouvement</translation>
 <translation id="1718835860248848330">Dernière heure</translation>
 <translation id="1736419249208073774">Découvrir</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
index 6e1f68f..aaad239 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Non mostrar outra vez</translation>
 <translation id="1692118695553449118">A sincronización está activada</translation>
 <translation id="169515064810179024">Impide que os sitios accedan aos sensores de movemento</translation>
-<translation id="1711267867945983636">Para continuar, activa a NFC no teu teléfono</translation>
 <translation id="1717218214683051432">Sensores de movemento</translation>
 <translation id="1718835860248848330">Última hora</translation>
 <translation id="1736419249208073774">Explorar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
index a4e10de..8947dca 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">ફરીથી બતાવશો નહીં</translation>
 <translation id="1692118695553449118">સમન્વયન ચાલુ છે</translation>
 <translation id="169515064810179024">સાઇટને મોશન સેન્સરને ઍક્સેસ કરવાથી બ્લૉક કરો</translation>
-<translation id="1711267867945983636">ચાલુ રાખવા માટે, તમારા ફોન પર NFC ચાલુ કરો</translation>
 <translation id="1717218214683051432">મોશન સેન્સર</translation>
 <translation id="1718835860248848330">છેલ્લા એક કલાક</translation>
 <translation id="1736419249208073774">શોધખોળ કરો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
index bcab3192..5f472b3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">फिर से न दिखाएं</translation>
 <translation id="1692118695553449118">समन्वयन चालू है</translation>
 <translation id="169515064810179024">साइटों को हलचल पकड़ने वाले सेंसर ऐक्सेस करने से रोकें</translation>
-<translation id="1711267867945983636">जारी रखने के लिए, अपने फ़ोन पर NFC चालू करें</translation>
 <translation id="1717218214683051432">मोशन सेंसर</translation>
 <translation id="1718835860248848330">पिछला घंटा</translation>
 <translation id="1736419249208073774">बेहतर जानें</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
index 8e5dbef..4917c75 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ne prikazuj ponovo</translation>
 <translation id="1692118695553449118">Sinkronizacija je uključena</translation>
 <translation id="169515064810179024">Blokiranje pristupa senzorima kretanja za web-lokacije</translation>
-<translation id="1711267867945983636">Da biste nastavili, uključite NFC na telefonu</translation>
 <translation id="1717218214683051432">Senzori kretanja</translation>
 <translation id="1718835860248848330">Zadnji sat</translation>
 <translation id="1736419249208073774">Istražite</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
index 139b97d0..0e93c0ad 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ne jelenjen meg többé</translation>
 <translation id="1692118695553449118">Szinkronizálás bekapcsolva</translation>
 <translation id="169515064810179024">A mozgásérzékelőkhöz való hozzáférés letiltása a webhelyek számára</translation>
-<translation id="1711267867945983636">A folytatáshoz kapcsolja be az NFC-t a telefonján</translation>
 <translation id="1717218214683051432">Mozgásérzékelők</translation>
 <translation id="1718835860248848330">Az elmúlt órából</translation>
 <translation id="1736419249208073774">Felfedezés</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
index e8532b5..40d92319 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Այլևս ցույց չտալ</translation>
 <translation id="1692118695553449118">Համաժամացումը միացված է</translation>
 <translation id="169515064810179024">Արգելել կայքերին օգտագործել շարժման տվիչները</translation>
-<translation id="1711267867945983636">Շարունակելու համար ձեր հեռախոսում միացրեք NFC-ն</translation>
 <translation id="1717218214683051432">Շարժման տվիչներ</translation>
 <translation id="1718835860248848330">Վերջին 1 ժամվա</translation>
 <translation id="1736419249208073774">Ուսումնասիրել</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
index adc5e0d..d9c1e76 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Jangan tampilkan lagi</translation>
 <translation id="1692118695553449118">Sinkronisasi aktif</translation>
 <translation id="169515064810179024">Memblokir situs agar tidak mengakses sensor gerakan</translation>
-<translation id="1711267867945983636">Untuk melanjutkan, aktifkan NFC di ponsel Anda</translation>
 <translation id="1717218214683051432">Sensor gerakan</translation>
 <translation id="1718835860248848330">1 jam terakhir</translation>
 <translation id="1736419249208073774">Jelajahi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
index 1391b8a..4c2324e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ekki sýna þetta aftur</translation>
 <translation id="1692118695553449118">Kveikt er á samstillingu</translation>
 <translation id="169515064810179024">Loka fyrir aðgang vefsvæða að hreyfiskynjurum</translation>
-<translation id="1711267867945983636">Kveiktu á NFC í símanum til að halda áfram</translation>
 <translation id="1717218214683051432">Hreyfiskynjarar</translation>
 <translation id="1718835860248848330">Undanfarna klukkustund</translation>
 <translation id="1736419249208073774">Kanna</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
index 2ec575a..7bbb0e50 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Non visualizzare più</translation>
 <translation id="1692118695553449118">La sincronizzazione è attiva</translation>
 <translation id="169515064810179024">Impedisci ai siti di accedere ai sensori di movimento</translation>
-<translation id="1711267867945983636">Per continuare, attiva la funzionalità NFC sul telefono</translation>
 <translation id="1717218214683051432">Sensori di movimento</translation>
 <translation id="1718835860248848330">Ultima ora</translation>
 <translation id="1736419249208073774">Esplora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
index 1bc5a4ab..69519052 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">אין להציג שוב</translation>
 <translation id="1692118695553449118">סנכרון מופעל</translation>
 <translation id="169515064810179024">חסימת הגישה של אתרים אל חיישני תנועה</translation>
-<translation id="1711267867945983636">‏כדי להמשיך, יש להפעיל בטלפון NFC</translation>
 <translation id="1717218214683051432">חיישני תנועה</translation>
 <translation id="1718835860248848330">מהשעה האחרונה</translation>
 <translation id="1736419249208073774">מידע נוסף</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index 01c22bc6..87226ce 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">次回から表示しない</translation>
 <translation id="1692118695553449118">同期は有効です</translation>
 <translation id="169515064810179024">サイトによるモーション センサーへのアクセスをブロックする</translation>
-<translation id="1711267867945983636">続行するには、スマートフォンで NFC をオンにしてください</translation>
 <translation id="1717218214683051432">モーション センサー</translation>
 <translation id="1718835860248848330">1 時間以内</translation>
 <translation id="1736419249208073774">詳しく見る</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
index cc3d439..cca4ba96 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">აღარ გამოჩნდეს</translation>
 <translation id="1692118695553449118">სინქრონიზაცია ჩართულია</translation>
 <translation id="169515064810179024">საიტებისთვის მოძრაობის სენსორებზე წვდომის აკრძალვა</translation>
-<translation id="1711267867945983636">გასაგრძელებლად თქვენს ტელეფონზე ჩართეთ NFC</translation>
 <translation id="1717218214683051432">მოძრაობის სენსორები</translation>
 <translation id="1718835860248848330">ბოლო საათი</translation>
 <translation id="1736419249208073774">მიმოხილვა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
index f3c6432..3a3ae5e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Қайта көрсетілмесін</translation>
 <translation id="1692118695553449118">Синхрондау қосылған</translation>
 <translation id="169515064810179024">Сайттардың қозғалыс датчиктерін пайдалануына тыйым салу</translation>
-<translation id="1711267867945983636">Жалғастыру үшін телефондағы NFC функциясын қосыңыз.</translation>
 <translation id="1717218214683051432">Қозғалыс датчиктері</translation>
 <translation id="1718835860248848330">Соңғы сағат</translation>
 <translation id="1736419249208073774">Зерттеу</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
index a500043..842c4099 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">កុំ​បង្ហាញ​ម្ដងទៀត</translation>
 <translation id="1692118695553449118">សមកម្មបានបើក</translation>
 <translation id="169515064810179024">ទប់ស្កាត់​គេហទំព័រ​មិនឱ្យ​ចូលប្រើ​ឧបករណ៍​ចាប់ចលនា</translation>
-<translation id="1711267867945983636">ដើម្បីបន្ត សូមបើក NFC នៅលើ​ទូរសព្ទ​របស់អ្នក</translation>
 <translation id="1717218214683051432">ឧបករណ៍​ចាប់ចលនា</translation>
 <translation id="1718835860248848330">មួយម៉ោងមុន</translation>
 <translation id="1736419249208073774">រុករក</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
index d9e22dd..30f1ce4 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -94,7 +94,6 @@
 <translation id="1672586136351118594">ಮತ್ತೊಮ್ಮೆ ತೋರಿಸಬೇಡಿ</translation>
 <translation id="1692118695553449118">ಸಿಂಕ್‌ ಆನ್‌ ಆಗಿದೆ</translation>
 <translation id="169515064810179024">ಚಲನಾ ಸೆನ್ಸರ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸದಂತೆ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
-<translation id="1711267867945983636">ಮುಂದುವರಿಸಲು, ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ NFC ಅನ್ನು ಆನ್ ಮಾಡಿ</translation>
 <translation id="1717218214683051432">ಮೋಷನ್ ಸೆನ್ಸಾರ್‌ಗಳು</translation>
 <translation id="1718835860248848330">ಕೊನೆಯ ಗಂಟೆ</translation>
 <translation id="1736419249208073774">ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮಾಡಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
index 07b17be..fbd868e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">다시 표시하지 않음</translation>
 <translation id="1692118695553449118">동기화 사용 중</translation>
 <translation id="169515064810179024">사이트에서 움직임 감지 센서에 액세스하지 못하도록 차단</translation>
-<translation id="1711267867945983636">계속하려면 휴대전화에서 NFC를 사용 설정하세요.</translation>
 <translation id="1717218214683051432">움직임 감지 센서</translation>
 <translation id="1718835860248848330">지난 1시간</translation>
 <translation id="1736419249208073774">탐색</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index 318447c..c06710b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Экинчи көрсөтүлбөсүн</translation>
 <translation id="1692118695553449118">Шайкештештирүү күйүк</translation>
 <translation id="169515064810179024">Сайттардын сенсорлорду колдонуусун бөгөттөө</translation>
-<translation id="1711267867945983636">Улантуу үчүн телефонуңуздагы NFC'ни күйгүзүңүз</translation>
 <translation id="1717218214683051432">Кыймыл сенсорлору</translation>
 <translation id="1718835860248848330">Акыркы бир саат</translation>
 <translation id="1736419249208073774">Изилдөө</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
index 0157991e..b8c84f9 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">ຢ່າສະແດງອີກ</translation>
 <translation id="1692118695553449118">ຊິງຄ໌ເປີດຢູ່</translation>
 <translation id="169515064810179024">ບລັອກເວັບໄຊບໍ່ໃຫ້ເຂົ້າເຖິງເຊັນເຊີກວດຈັບການເຄື່ອນໄຫວ</translation>
-<translation id="1711267867945983636">ກະລຸນາເປີດ NFC ໃນໂທລະສັບຂອງທ່ານເພື່ອສືບຕໍ່</translation>
 <translation id="1717218214683051432">ເຊັນກວດຈັບການເຄື່ອນໄຫວ</translation>
 <translation id="1718835860248848330">ຊົ່ວໂມງຜ່ານມາ</translation>
 <translation id="1736419249208073774">ສຳຫຼວດເບິ່ງ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
index 2f731e2..5f0f1af 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Daugiau neberodyti</translation>
 <translation id="1692118695553449118">Sinchronizavimas įjungtas</translation>
 <translation id="169515064810179024">Svetainės užblokuotos, kad nepasiektų judesio jutiklių</translation>
-<translation id="1711267867945983636">Norėdami tęsti įjunkite ALR telefone</translation>
 <translation id="1717218214683051432">Judesių jutikliai</translation>
 <translation id="1718835860248848330">Paskutinė valanda</translation>
 <translation id="1736419249208073774">Naršyti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
index b5d28a48..d2a2d6e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Vairs nerādīt</translation>
 <translation id="1692118695553449118">Sinhronizācija ieslēgta</translation>
 <translation id="169515064810179024">Bloķēt vietņu piekļuvi kustību sensoriem</translation>
-<translation id="1711267867945983636">Lai turpinātu, tālrunī ieslēdziet tehnoloģiju NFC</translation>
 <translation id="1717218214683051432">Kustību sensori</translation>
 <translation id="1718835860248848330">Pēdējā stunda</translation>
 <translation id="1736419249208073774">Izpētīt</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
index 2e89aac..958a376 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Не прикажувај повторно</translation>
 <translation id="1692118695553449118">Синхронизацијата е вклучена</translation>
 <translation id="169515064810179024">Блокирајте го пристапот до сензорите за движење за сајтовите</translation>
-<translation id="1711267867945983636">За да продолжите, вклучете ја NFC на телефонот</translation>
 <translation id="1717218214683051432">Сензори за движење</translation>
 <translation id="1718835860248848330">Изминатиот час</translation>
 <translation id="1736419249208073774">Истражете</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
index 4aad5bed..9800abaa 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">വീണ്ടും കാണിക്കരുത്</translation>
 <translation id="1692118695553449118">സമന്വയം ഓണാണ്</translation>
 <translation id="169515064810179024">ചലന സെൻസറുകൾ ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
-<translation id="1711267867945983636">തുടരാൻ നിങ്ങളുടെ ഫോണിൽ NFC ഓണാക്കുക</translation>
 <translation id="1717218214683051432">ചലന സെൻസറുകൾ</translation>
 <translation id="1718835860248848330">കഴിഞ്ഞ മണിക്കൂര്‍‌</translation>
 <translation id="1736419249208073774">അടുത്തറിയുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
index b6ead9c..7d8bdd6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Дахиж бүү харуул</translation>
 <translation id="1692118695553449118">Тохиргоо асаалттай байна.</translation>
 <translation id="169515064810179024">Сайтуудыг хөдөлгөөн мэдрэгчид хандахыг хориглох</translation>
-<translation id="1711267867945983636">Үргэлжлүүлэхийн тулд утсан дээрээ NFC-г асаана уу</translation>
 <translation id="1717218214683051432">Хөдөлгөөн мэдрэгч</translation>
 <translation id="1718835860248848330">Сүүлийн цаг</translation>
 <translation id="1736419249208073774">Судлах</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
index 206d084c..2bd2903 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">पुन्हा दाखवू नका</translation>
 <translation id="1692118695553449118">संकालन चालू आहे</translation>
 <translation id="169515064810179024">साइटना मोशन सेन्सर ॲक्सेसपासून ब्लॉक करा</translation>
-<translation id="1711267867945983636">पुढे सुरू ठेवण्यासाठी, तुमच्या फोनवर NFC सुरू करा</translation>
 <translation id="1717218214683051432">मोशन सेन्सर</translation>
 <translation id="1718835860248848330">शेवटच्या तासामधील</translation>
 <translation id="1736419249208073774">एक्सप्लोर करा</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
index 5095ee7..06950d84 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Jangan tunjukkan lagi</translation>
 <translation id="1692118695553449118">Penyegerakan dihidupkan</translation>
 <translation id="169515064810179024">Sekat tapak daripada mengakses penderia gerakan</translation>
-<translation id="1711267867945983636">Hidupkan NFC pada telefon anda untuk meneruskan</translation>
 <translation id="1717218214683051432">Penderia gerakan</translation>
 <translation id="1718835860248848330">Jam terakhir</translation>
 <translation id="1736419249208073774">Teroka</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
index 2735b7b..88df74f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">နောက်ထပ်မပြပါနှင့်</translation>
 <translation id="1692118695553449118">စင့်က်ကို ဖွင့်ထား</translation>
 <translation id="169515064810179024">ဝဘ်ဆိုက်များအား အာရုံခံစနစ်များ အသုံးပြုခြင်းကို တားမြစ်ရန်</translation>
-<translation id="1711267867945983636">ရှေ့ဆက်ရန် သင့်ဖုန်းပေါ်ရှိ NFC ကို ဖွင့်ပါ</translation>
 <translation id="1717218214683051432">လှုပ်ရှားမှု အာရုံခံစနစ်များ</translation>
 <translation id="1718835860248848330">နောက်ဆုံးတစ်နာရီ</translation>
 <translation id="1736419249208073774">စူးစမ်းလေ့လာရန်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
index 5bfe44c..4587985 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">फेरि नदेखाउनुहोस्</translation>
 <translation id="1692118695553449118">सिंक खुला छ</translation>
 <translation id="169515064810179024">साइटहरूलाई चालसम्बन्धी सेन्सरहरूमाथि पहुँच राख्नबाट रोक्नुहोस्‌</translation>
-<translation id="1711267867945983636">जारी राख्न आफ्नो फोनमा NFC सक्रिय गर्नुहोस्</translation>
 <translation id="1717218214683051432">चालसम्बन्धी सेन्सरहरू</translation>
 <translation id="1718835860248848330">पछिल्लो घन्टा</translation>
 <translation id="1736419249208073774">अन्वेषण गर्नुहोस्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
index f98eefe..9a8d7a5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Niet opnieuw weergeven</translation>
 <translation id="1692118695553449118">Synchronisatie is ingeschakeld</translation>
 <translation id="169515064810179024">Sites geen toegang tot bewegingssensoren geven</translation>
-<translation id="1711267867945983636">Schakel NFC in op je telefoon om door te gaan</translation>
 <translation id="1717218214683051432">Bewegingssensoren</translation>
 <translation id="1718835860248848330">Afgelopen uur</translation>
 <translation id="1736419249208073774">Verkennen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
index 1f56aef..6631765b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ikke vis igjen</translation>
 <translation id="1692118695553449118">Synkronisering er slått på.</translation>
 <translation id="169515064810179024">Blokkér nettsteder fra å få tilgang til bevegelsessensorer</translation>
-<translation id="1711267867945983636">For å fortsette, slå på NFC på telefonen</translation>
 <translation id="1717218214683051432">Bevegelsessensorer</translation>
 <translation id="1718835860248848330">Siste time</translation>
 <translation id="1736419249208073774">Utforsk</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
index 7524538..77b58b8b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ</translation>
 <translation id="1692118695553449118">ସିଙ୍କ୍ ଚାଲୁ ଅଛି</translation>
 <translation id="169515064810179024">ମୋସନ୍ ସେନ୍ସର୍ ଆକ୍ସେସ୍ କରିବାରୁ ସାଇଟ୍‍ଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
-<translation id="1711267867945983636">ଜାରି ରଖିବା ପାଇଁ, ଆପଣଙ୍କର ଫୋନ୍‌ରେ NFC ଚାଲୁ କରନ୍ତୁ</translation>
 <translation id="1717218214683051432">ମୋସନ୍ ସେନ୍ସର୍</translation>
 <translation id="1718835860248848330">ଶେଷ ଘଣ୍ଟାକର</translation>
 <translation id="1736419249208073774">ଏକ୍ସପ୍ଲୋର୍‍ କରନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
index 59577e0..17c36fd3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ</translation>
 <translation id="1692118695553449118">ਸਿੰਕ ਚਾਲੂ ਹੈ</translation>
 <translation id="169515064810179024">ਸਾਈਟਾਂ ਨੂੰ ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation>
-<translation id="1711267867945983636">ਜਾਰੀ ਰੱਖਣ ਲਈ, ਤੁਹਾਡੇ ਫ਼ੋਨ 'ਤੇ NFC ਚਾਲੂ ਕਰੋ</translation>
 <translation id="1717218214683051432">ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰ</translation>
 <translation id="1718835860248848330">ਪਿਛਲਾ ਘੰਟਾ</translation>
 <translation id="1736419249208073774">ਪੜਚੋਲ ਕਰੋ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
index ad5acc9..9c55dbf 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Nie pokazuj ponownie</translation>
 <translation id="1692118695553449118">Synchronizacja jest włączona</translation>
 <translation id="169515064810179024">Blokuj stronom dostęp do czujników ruchu</translation>
-<translation id="1711267867945983636">Aby kontynuować, włącz na telefonie NFC</translation>
 <translation id="1717218214683051432">Czujniki ruchu</translation>
 <translation id="1718835860248848330">Ostatnia godzina</translation>
 <translation id="1736419249208073774">Odkrywaj</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
index 03626f3..682c6fc 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Não mostrar novamente</translation>
 <translation id="1692118695553449118">A sincronização está ativada</translation>
 <translation id="169515064810179024">Impedir que sites acessem os sensores de movimento</translation>
-<translation id="1711267867945983636">Para continuar, ative a NFC no smartphone</translation>
 <translation id="1717218214683051432">Sensores de movimento</translation>
 <translation id="1718835860248848330">Última hora</translation>
 <translation id="1736419249208073774">Explorar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
index 993d091a..5dca3f3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Não mostrar de novo</translation>
 <translation id="1692118695553449118">A sincronização está ativada</translation>
 <translation id="169515064810179024">Impedir que os sites acedam aos sensores de movimentos</translation>
-<translation id="1711267867945983636">Para continuar, ative o NFC no telemóvel.</translation>
 <translation id="1717218214683051432">Sensores de movimento</translation>
 <translation id="1718835860248848330">Última hora</translation>
 <translation id="1736419249208073774">Explorar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index 673e8ef6..5623352 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Nu mai afișa</translation>
 <translation id="1692118695553449118">Sincronizarea este activată</translation>
 <translation id="169515064810179024">Împiedică site-urile să acceseze senzorii de mișcare</translation>
-<translation id="1711267867945983636">Pentru a continua, activează NFC pe telefon</translation>
 <translation id="1717218214683051432">Senzori de mișcare</translation>
 <translation id="1718835860248848330">Ultima oră</translation>
 <translation id="1736419249208073774">Explorează</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
index af4408a..06250d7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Больше не показывать</translation>
 <translation id="1692118695553449118">Синхронизация включена</translation>
 <translation id="169515064810179024">Закрыть сайтам доступ к датчикам движения</translation>
-<translation id="1711267867945983636">Чтобы продолжить, включите NFC на телефоне.</translation>
 <translation id="1717218214683051432">Датчики движения</translation>
 <translation id="1718835860248848330">Последний час</translation>
 <translation id="1736419249208073774">Подробнее</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
index 98a8649a..c6302fb7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">නැවත නොපෙන්වන්න</translation>
 <translation id="1692118695553449118">සමමුහුර්තයකරණය සක්‍රියයි</translation>
 <translation id="169515064810179024">වෙබ් අඩවි චලන සංවේදක වෙත ප්‍රවේශ වීම අවහිර කරන්න</translation>
-<translation id="1711267867945983636">ඉදිරියට යාමට, ඔබේ දුරකථනය මත NFC සක්‍රීය කරන්න</translation>
 <translation id="1717218214683051432">චලන සංවේදක</translation>
 <translation id="1718835860248848330">පසුගිය පැය</translation>
 <translation id="1736419249208073774">ගවේෂණය කරන්න</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
index fc74851a..e0b50bde 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Nabudúce nezobrazovať</translation>
 <translation id="1692118695553449118">Synchronizácia je zapnutá.</translation>
 <translation id="169515064810179024">Blokovať webom prístup k senzorom pohybu</translation>
-<translation id="1711267867945983636">Ak chcete pokračovať, zapnite NFC vo svojom telefóne</translation>
 <translation id="1717218214683051432">Senzory pohybu</translation>
 <translation id="1718835860248848330">Posledná hodina</translation>
 <translation id="1736419249208073774">Preskúmať</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index 7f2a69a..478ea77 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Tega ne prikaži več</translation>
 <translation id="1692118695553449118">Sinhroniziranje je vklopljeno</translation>
 <translation id="169515064810179024">Spletnim mestom prepreči dostop do tipal gibanja</translation>
-<translation id="1711267867945983636">Če želite nadaljevati, vklopite tehnologijo NFC v telefonu.</translation>
 <translation id="1717218214683051432">Tipala gibanja</translation>
 <translation id="1718835860248848330">Zadnja ura</translation>
 <translation id="1736419249208073774">Razišči</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
index bb48b44..2a04631 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Mos e shfaq përsëri</translation>
 <translation id="1692118695553449118">Sinkronizimi është aktiv</translation>
 <translation id="169515064810179024">Bllokojua faqeve hapjen e sensorëve të lëvizjes</translation>
-<translation id="1711267867945983636">Për të vazhduar, aktivizo veçorinë NFC në telefon</translation>
 <translation id="1717218214683051432">Sensorët e lëvizjes</translation>
 <translation id="1718835860248848330">Ora e fundit</translation>
 <translation id="1736419249208073774">Eksploro</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
index 15a6d3b..772fba0 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Не приказуј поново</translation>
 <translation id="1692118695553449118">Синхронизација је укључена</translation>
 <translation id="169515064810179024">Не дозвољавај сајтовима да приступају сензорима за покрет</translation>
-<translation id="1711267867945983636">Да бисте наставили, укључите NFC на телефону</translation>
 <translation id="1717218214683051432">Сензори покрета</translation>
 <translation id="1718835860248848330">Последњих сат времена</translation>
 <translation id="1736419249208073774">Истражи</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
index ac774373..bdfa359 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Visa inte igen</translation>
 <translation id="1692118695553449118">Synkronisering är på</translation>
 <translation id="169515064810179024">Blockera webbplatser från att använda enhetens rörelsesensorer</translation>
-<translation id="1711267867945983636">Fortsätt genom att aktivera NFC på telefonen</translation>
 <translation id="1717218214683051432">Rörelsesensorer</translation>
 <translation id="1718835860248848330">Senaste timmen</translation>
 <translation id="1736419249208073774">Utforska</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
index 48b789d..c814c6f2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Usionyeshe tena</translation>
 <translation id="1692118695553449118">Usawazishajii umewashwa</translation>
 <translation id="169515064810179024">Zuia tovuti zisifikie vitambuzi vya mwendo</translation>
-<translation id="1711267867945983636">Ili uendelee, washa NFC kwenye simu yako</translation>
 <translation id="1717218214683051432">Vitambuzi vya mwendo</translation>
 <translation id="1718835860248848330">Saa iliyopita</translation>
 <translation id="1736419249208073774">Gundua</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
index 55fcca9..1cc2da4b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">மீண்டும் காட்டாதே</translation>
 <translation id="1692118695553449118">ஒத்திசைவு இயக்கத்தில்</translation>
 <translation id="169515064810179024">தளங்கள் மோஷன் சென்சார்களை அணுகுவதைத் தடுக்கும்</translation>
-<translation id="1711267867945983636">தொடர்வதற்கு உங்கள் மொபைலில் NFCயை ஆன் செய்யுங்கள்</translation>
 <translation id="1717218214683051432">மோஷன் சென்சார்கள்</translation>
 <translation id="1718835860248848330">கடந்த ஒரு மணிநேரம்</translation>
 <translation id="1736419249208073774">அறிக</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
index 93bdc0c..3fa03af 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">మళ్లీ చూపవద్దు</translation>
 <translation id="1692118695553449118">సమకాలీకరణ ఆన్‌లో ఉంది</translation>
 <translation id="169515064810179024">మోషన్ సెన్సార్‌లను యాక్సెస్ చేయనీయకుండా సైట్‌లను బ్లాక్ చేస్తుంది</translation>
-<translation id="1711267867945983636">కొనసాగించడానికి, మీ ఫోన్‌లో NFC ఆన్ చేయండి</translation>
 <translation id="1717218214683051432">మోషన్ సెన్సార్‌లు</translation>
 <translation id="1718835860248848330">చివరి గంట</translation>
 <translation id="1736419249208073774">అన్వేషించండి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
index 2ec89bf6..583fe2e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">ไม่ต้องแสดงอีก</translation>
 <translation id="1692118695553449118">การซิงค์เปิดอยู่</translation>
 <translation id="169515064810179024">บล็อกไม่ให้เว็บไซต์เข้าถึงเซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation>
-<translation id="1711267867945983636">หากต้องการดำเนินการต่อ ให้เปิด NFC ในโทรศัพท์</translation>
 <translation id="1717218214683051432">เซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation>
 <translation id="1718835860248848330">ชั่วโมงที่แล้ว</translation>
 <translation id="1736419249208073774">สำรวจ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
index d7eef54..1c26473 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Bir daha gösterme</translation>
 <translation id="1692118695553449118">Senkronizasyon açık.</translation>
 <translation id="169515064810179024">Sitelerin hareket sensörlerine erişimini engelle</translation>
-<translation id="1711267867945983636">Devam etmek için telefonunuzda NFC'yi açın</translation>
 <translation id="1717218214683051432">Hareket sensörleri</translation>
 <translation id="1718835860248848330">Son saat</translation>
 <translation id="1736419249208073774">Keşfet</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
index 549fc55..fb855fa 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Більше не показувати</translation>
 <translation id="1692118695553449118">Синхронізацію ввімкнено</translation>
 <translation id="169515064810179024">Заборонити сайтам доступ до датчиків руху</translation>
-<translation id="1711267867945983636">Щоб продовжити, увімкніть NFC на телефоні</translation>
 <translation id="1717218214683051432">Датчики руху</translation>
 <translation id="1718835860248848330">Остання година</translation>
 <translation id="1736419249208073774">Огляд</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
index ec8e39d..acf6bc0 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">دوبارہ نہ دکھائیں</translation>
 <translation id="1692118695553449118">مطابقت پذیری آن ہے</translation>
 <translation id="169515064810179024">سائٹس کو موشن سینسرز تک رسائی حاصل کرنے سے مسدود کریں</translation>
-<translation id="1711267867945983636">‏جاری رکھنے کے لیے، اپنے فون پر NFC آن کریں</translation>
 <translation id="1717218214683051432">موشن سینسرز</translation>
 <translation id="1718835860248848330">پچھلے گھنٹے</translation>
 <translation id="1736419249208073774">دریافت کریں</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index 7b5326e..3ff7d52 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Boshqa ko‘rsatilmasin</translation>
 <translation id="1692118695553449118">Sinxronlash yoniq</translation>
 <translation id="169515064810179024">Saytlarga harakat sensorlaridan foydalanishni taqiqlash</translation>
-<translation id="1711267867945983636">Davom etish uchun telefonda NFC funksiyasini yoqing</translation>
 <translation id="1717218214683051432">Harakat sensorlari</translation>
 <translation id="1718835860248848330">Oxirgi bir soat</translation>
 <translation id="1736419249208073774">Tanishuv</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
index 0735699..0585122e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Không hiển thị lại</translation>
 <translation id="1692118695553449118">Đồng bộ hóa đang bật</translation>
 <translation id="169515064810179024">Chặn không cho các trang web sử dụng cảm biến chuyển động</translation>
-<translation id="1711267867945983636">Để tiếp tục, hãy bật NFC trên điện thoại</translation>
 <translation id="1717218214683051432">Cảm biến chuyển động</translation>
 <translation id="1718835860248848330">Giờ vừa qua</translation>
 <translation id="1736419249208073774">Khám phá</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
index f7ddbea0..ed774ef 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">不再显示</translation>
 <translation id="1692118695553449118">同步功能已开启</translation>
 <translation id="169515064810179024">禁止网站使用动态传感器</translation>
-<translation id="1711267867945983636">要继续,请开启手机的 NFC 功能</translation>
 <translation id="1717218214683051432">动态传感器</translation>
 <translation id="1718835860248848330">过去一小时</translation>
 <translation id="1736419249208073774">探索</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
index 5d31aaba..45046f8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">不要再顯示</translation>
 <translation id="1692118695553449118">同步處理已開啟</translation>
 <translation id="169515064810179024">禁止網站存取動作感應器</translation>
-<translation id="1711267867945983636">開啟手機上的 NFC 即可繼續</translation>
 <translation id="1717218214683051432">動作感應器</translation>
 <translation id="1718835860248848330">過去一小時</translation>
 <translation id="1736419249208073774">探索</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
index 583e9e43..8a38828 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">不要再顯示</translation>
 <translation id="1692118695553449118">同步功能已啟用</translation>
 <translation id="169515064810179024">禁止網站存取動作感應器</translation>
-<translation id="1711267867945983636">如要繼續,請開啟手機的 NFC 功能</translation>
 <translation id="1717218214683051432">動作感應器</translation>
 <translation id="1718835860248848330">過去 1 小時</translation>
 <translation id="1736419249208073774">探索</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
index e4c4682..284e697 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -93,7 +93,6 @@
 <translation id="1672586136351118594">Ungabonisi futhi</translation>
 <translation id="1692118695553449118">Ukuvumelanisa kuvuliwe</translation>
 <translation id="169515064810179024">Vimbela amasayithi kusukela ekufinyeleleni kuzinzwa zokunyakaza</translation>
-<translation id="1711267867945983636">Ukuze uqhubeke, vula i-NFC efonini yakho</translation>
 <translation id="1717218214683051432">Izinzwa zokunyakaza</translation>
 <translation id="1718835860248848330">Ihora lokugcina</translation>
 <translation id="1736419249208073774">Hlola</translation>
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
index a282e08..5e5e2ee 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -156,7 +156,7 @@
 
   arc::mojom::IntentHelperInstance* intent_helper_instance =
       GET_INTENT_HELPER_INSTANCE(SendBroadcast);
-  if (intent_helper_instance) {
+  if (intent_helper_instance && IsMouseOrTouchEventFromFlags(event_flags)) {
     base::DictionaryValue extras;
     extras.SetBoolean("inTouchMode", IsMouseOrTouchEventFromFlags(event_flags));
     std::string extras_string;
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
index 44103e1..6a37dc8a 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
@@ -184,7 +184,7 @@
     if (plugin_vm::IsPluginVmEnabled(profile)) {
       plugin_vm::PluginVmManager::GetForProfile(profile)->LaunchPluginVm();
     } else {
-      plugin_vm::ShowPluginVmLauncherView(profile);
+      plugin_vm::ShowPluginVmInstallerView(profile);
     }
   } else if (app_id == ash::kReleaseNotesAppId) {
     base::RecordAction(
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 34d05551..18f0d809 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -42,6 +42,7 @@
 #include "chrome/browser/ui/singleton_tabs.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
+#include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
 #include "chrome/browser/ui/webui/inspect_ui.h"
 #include "chrome/common/content_restriction.h"
@@ -639,13 +640,13 @@
       break;
     case IDC_CREATE_SHORTCUT:
       base::RecordAction(base::UserMetricsAction("CreateShortcut"));
-      CreateBookmarkAppFromCurrentWebContents(browser_,
-                                              true /* force_shortcut_app */);
+      web_app::CreateWebAppFromCurrentWebContents(
+          browser_, true /* force_shortcut_app */);
       break;
     case IDC_INSTALL_PWA:
       base::RecordAction(base::UserMetricsAction("InstallWebAppFromMenu"));
-      CreateBookmarkAppFromCurrentWebContents(browser_,
-                                              false /* force_shortcut_app */);
+      web_app::CreateWebAppFromCurrentWebContents(
+          browser_, false /* force_shortcut_app */);
       break;
     case IDC_DEV_TOOLS:
       ToggleDevToolsWindow(browser_, DevToolsToggleAction::Show());
@@ -1157,13 +1158,14 @@
   if (browser_->is_type_devtools())
     command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
 
-  bool can_create_bookmark_app = CanCreateBookmarkApp(browser_);
-  command_updater_.UpdateCommandEnabled(IDC_INSTALL_PWA,
-                                        can_create_bookmark_app);
+  bool can_create_web_app = web_app::CanCreateWebApp(browser_);
+  command_updater_.UpdateCommandEnabled(IDC_INSTALL_PWA, can_create_web_app);
   command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUT,
-                                        can_create_bookmark_app);
+                                        can_create_web_app);
+  // Note that additional logic in AppMenuModel::Build() controls the presence
+  // of this command.
   command_updater_.UpdateCommandEnabled(IDC_OPEN_IN_PWA_WINDOW,
-                                        can_create_bookmark_app);
+                                        web_app::CanPopOutWebApp(profile()));
 
   command_updater_.UpdateCommandEnabled(
       IDC_TOGGLE_REQUEST_TABLET_SITE,
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 2f9a064..12bf88d 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -109,7 +109,6 @@
 #include "chrome/browser/ui/extensions/app_launch_params.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
 #include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
-#include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/extension_metrics.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
@@ -1430,20 +1429,6 @@
                                              .CanViewSource();
 }
 
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-void CreateBookmarkAppFromCurrentWebContents(Browser* browser,
-                                             bool force_shortcut_app) {
-  // TODO(alancutter): Legacy metric to remove in ~M80.
-  base::RecordAction(UserMetricsAction("CreateHostedApp"));
-  web_app::CreateWebAppFromCurrentWebContents(browser, force_shortcut_app,
-                                              base::DoNothing());
-}
-
-bool CanCreateBookmarkApp(const Browser* browser) {
-  return web_app::CanCreateWebApp(browser);
-}
-#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
-
 #if !defined(TOOLKIT_VIEWS)
 base::Optional<int> GetKeyboardFocusedTabIndex(const Browser* browser) {
   return base::nullopt;
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h
index 0e2e65c..f55b91b 100644
--- a/chrome/browser/ui/browser_commands.h
+++ b/chrome/browser/ui/browser_commands.h
@@ -191,14 +191,6 @@
 Browser* OpenInChrome(Browser* hosted_app_browser);
 bool CanViewSource(const Browser* browser);
 
-// Initiates user flow for creating a bookmark app for the current page.
-// Will install a PWA hosted app if the site meets installability requirements
-// (see |AppBannerManager::PerformInstallableCheck|) unless |force_shortcut_app|
-// is true.
-void CreateBookmarkAppFromCurrentWebContents(Browser* browser,
-                                             bool force_shortcut_app);
-bool CanCreateBookmarkApp(const Browser* browser);
-
 base::Optional<int> GetKeyboardFocusedTabIndex(const Browser* browser);
 
 }  // namespace chrome
diff --git a/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc b/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc
index 5d1a3f85..211b91d 100644
--- a/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc
+++ b/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc
@@ -25,6 +25,8 @@
 
 const char kDefaultTestUrl[] = "https://www.google.com/";
 
+const char* const kTestPhysicalDeviceIds[] = {"1", "2", "3"};
+
 const uint16_t kYubicoVendorId = 0x1050;
 const uint16_t kYubicoGnubbyProductId = 0x0200;
 
@@ -88,6 +90,7 @@
   }
 
   device::mojom::HidDeviceInfoPtr CreateAndAddFakeHidDevice(
+      const std::string& physical_device_id,
       uint32_t vendor_id,
       uint16_t product_id,
       const std::string& product_string,
@@ -95,8 +98,9 @@
       uint16_t usage_page = device::mojom::kPageGenericDesktop,
       uint16_t usage = device::mojom::kGenericDesktopGamePad) {
     return hid_manager_.CreateAndAddDeviceWithTopLevelUsage(
-        vendor_id, product_id, product_string, serial_number,
-        device::mojom::HidBusType::kHIDBusTypeUSB, usage_page, usage);
+        physical_device_id, vendor_id, product_id, product_string,
+        serial_number, device::mojom::HidBusType::kHIDBusTypeUSB, usage_page,
+        usage);
   }
 
   blink::mojom::DeviceIdFilterPtr CreateVendorFilter(uint16_t vendor_id) {
@@ -144,8 +148,8 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(kYubicoVendorId, kYubicoGnubbyProductId, "gnubby",
-                            "001");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], kYubicoVendorId,
+                            kYubicoGnubbyProductId, "gnubby", "001");
   run_loop.Run();
   EXPECT_EQ(0u, hid_chooser_controller->NumOptions());
 }
@@ -158,9 +162,10 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "fido", "001", device::mojom::kPageFido,
-                            kFidoU2fHidUsage);
-  CreateAndAddFakeHidDevice(2, 2, "fido", "002", device::mojom::kPageFido, 0);
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "fido", "001",
+                            device::mojom::kPageFido, kFidoU2fHidUsage);
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 2, 2, "fido", "002",
+                            device::mojom::kPageFido, 0);
   run_loop.Run();
   EXPECT_EQ(0u, hid_chooser_controller->NumOptions());
 }
@@ -170,7 +175,7 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001");
   run_loop.Run();
   EXPECT_EQ(1u, hid_chooser_controller->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("a (Vendor: 0x0001, Product: 0x0001)"),
@@ -182,7 +187,7 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "", "001");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "", "001");
   run_loop.Run();
   EXPECT_EQ(1u, hid_chooser_controller->NumOptions());
   EXPECT_EQ(
@@ -199,9 +204,9 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001");
-  CreateAndAddFakeHidDevice(1, 2, "b", "002");
-  CreateAndAddFakeHidDevice(2, 2, "c", "003");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 1, 2, "b", "002");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[2], 2, 2, "c", "003");
   run_loop.Run();
 
   EXPECT_EQ(2u, hid_chooser_controller->NumOptions());
@@ -224,9 +229,9 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001");
-  CreateAndAddFakeHidDevice(1, 2, "b", "002");
-  CreateAndAddFakeHidDevice(2, 2, "c", "003");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 1, 2, "b", "002");
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[2], 2, 2, "c", "003");
   run_loop.Run();
 
   EXPECT_EQ(1u, hid_chooser_controller->NumOptions());
@@ -243,11 +248,11 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopGamePad);
-  CreateAndAddFakeHidDevice(2, 2, "b", "002", device::mojom::kPageSimulation,
-                            5);
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 2, 2, "b", "002",
+                            device::mojom::kPageSimulation, 5);
   run_loop.Run();
 
   EXPECT_EQ(1u, hid_chooser_controller->NumOptions());
@@ -266,14 +271,14 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopGamePad);
-  CreateAndAddFakeHidDevice(2, 2, "b", "002",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 2, 2, "b", "002",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopKeyboard);
-  CreateAndAddFakeHidDevice(3, 3, "c", "003", device::mojom::kPageSimulation,
-                            5);
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[2], 3, 3, "c", "003",
+                            device::mojom::kPageSimulation, 5);
   run_loop.Run();
 
   EXPECT_EQ(1u, hid_chooser_controller->NumOptions());
@@ -292,14 +297,14 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopGamePad);
-  CreateAndAddFakeHidDevice(2, 2, "b", "002",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 2, 2, "b", "002",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopGamePad);
-  CreateAndAddFakeHidDevice(1, 1, "c", "003", device::mojom::kPageSimulation,
-                            5);
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[2], 1, 1, "c", "003",
+                            device::mojom::kPageSimulation, 5);
   run_loop.Run();
 
   EXPECT_EQ(1u, hid_chooser_controller->NumOptions());
@@ -320,14 +325,14 @@
   base::RunLoop run_loop;
   fake_hid_chooser_view_.set_options_initialized_quit_closure(
       run_loop.QuitClosure());
-  CreateAndAddFakeHidDevice(1, 1, "a", "001",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[0], 1, 1, "a", "001",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopGamePad);
-  CreateAndAddFakeHidDevice(2, 2, "b", "002",
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[1], 2, 2, "b", "002",
                             device::mojom::kPageGenericDesktop,
                             device::mojom::kGenericDesktopGamePad);
-  CreateAndAddFakeHidDevice(1, 1, "c", "003", device::mojom::kPageSimulation,
-                            5);
+  CreateAndAddFakeHidDevice(kTestPhysicalDeviceIds[2], 1, 1, "c", "003",
+                            device::mojom::kPageSimulation, 5);
   run_loop.Run();
 
   EXPECT_EQ(3u, hid_chooser_controller->NumOptions());
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
similarity index 80%
rename from chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc
rename to chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
index f1b9825c..5a46613 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h"
+#include "chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h"
 
 #include <memory>
 
 #include "base/optional.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager_factory.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer_factory.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_metrics_util.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
@@ -33,7 +33,7 @@
 
 namespace {
 
-PluginVmLauncherView* g_plugin_vm_launcher_view = nullptr;
+PluginVmInstallerView* g_plugin_vm_installer_view = nullptr;
 
 constexpr gfx::Insets kButtonRowInsets(0, 64, 32, 64);
 constexpr int kWindowWidth = 768;
@@ -51,20 +51,20 @@
 
 }  // namespace
 
-void plugin_vm::ShowPluginVmLauncherView(Profile* profile) {
-  if (!g_plugin_vm_launcher_view) {
-    g_plugin_vm_launcher_view = new PluginVmLauncherView(profile);
-    views::DialogDelegate::CreateDialogWidget(g_plugin_vm_launcher_view,
+void plugin_vm::ShowPluginVmInstallerView(Profile* profile) {
+  if (!g_plugin_vm_installer_view) {
+    g_plugin_vm_installer_view = new PluginVmInstallerView(profile);
+    views::DialogDelegate::CreateDialogWidget(g_plugin_vm_installer_view,
                                               nullptr, nullptr);
   }
-  g_plugin_vm_launcher_view->SetButtonRowInsets(kButtonRowInsets);
-  g_plugin_vm_launcher_view->GetWidget()->Show();
+  g_plugin_vm_installer_view->SetButtonRowInsets(kButtonRowInsets);
+  g_plugin_vm_installer_view->GetWidget()->Show();
 }
 
-PluginVmLauncherView::PluginVmLauncherView(Profile* profile)
+PluginVmInstallerView::PluginVmInstallerView(Profile* profile)
     : profile_(profile),
-      plugin_vm_image_manager_(
-          plugin_vm::PluginVmImageManagerFactory::GetForProfile(profile)) {
+      plugin_vm_installer_(
+          plugin_vm::PluginVmInstallerFactory::GetForProfile(profile)) {
   // Layout constants from the spec.
   gfx::Insets kDialogInsets(60, 64, 0, 64);
   constexpr gfx::Insets kLowerContainerInsets(12, 0, 52, 0);
@@ -160,7 +160,7 @@
   big_image_->SetImageSize(kBigImageSize);
   big_image_->SetImage(
       ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-          IDR_PLUGIN_VM_LAUNCHER));
+          IDR_PLUGIN_VM_INSTALLER));
   lower_container_view->AddChildView(big_image_);
 
   // Make sure the lower_container_view is pinned to the bottom of the dialog.
@@ -170,15 +170,15 @@
 }
 
 // static
-PluginVmLauncherView* PluginVmLauncherView::GetActiveViewForTesting() {
-  return g_plugin_vm_launcher_view;
+PluginVmInstallerView* PluginVmInstallerView::GetActiveViewForTesting() {
+  return g_plugin_vm_installer_view;
 }
 
-bool PluginVmLauncherView::ShouldShowWindowTitle() const {
+bool PluginVmInstallerView::ShouldShowWindowTitle() const {
   return false;
 }
 
-bool PluginVmLauncherView::Accept() {
+bool PluginVmInstallerView::Accept() {
   if (state_ == State::FINISHED) {
     // Launch button has been clicked.
     plugin_vm::PluginVmManager::GetForProfile(profile_)->LaunchPluginVm();
@@ -191,22 +191,22 @@
   return false;
 }
 
-bool PluginVmLauncherView::Cancel() {
+bool PluginVmInstallerView::Cancel() {
   if (state_ == State::DOWNLOADING_DLC ||
       state_ == State::START_DLC_DOWNLOADING) {
-    plugin_vm_image_manager_->CancelDlcDownload();
+    plugin_vm_installer_->CancelDlcDownload();
 
     plugin_vm::RecordPluginVmSetupResultHistogram(
         plugin_vm::PluginVmSetupResult::kUserCancelledDownloadingPluginVmDlc);
   }
   if (state_ == State::DOWNLOADING || state_ == State::START_DOWNLOADING) {
-    plugin_vm_image_manager_->CancelDownload();
+    plugin_vm_installer_->CancelDownload();
 
     plugin_vm::RecordPluginVmSetupResultHistogram(
         plugin_vm::PluginVmSetupResult::kUserCancelledDownloadingPluginVmImage);
   }
   if (state_ == State::IMPORTING) {
-    plugin_vm_image_manager_->CancelImport();
+    plugin_vm_installer_->CancelImport();
 
     plugin_vm::RecordPluginVmSetupResultHistogram(
         plugin_vm::PluginVmSetupResult::kUserCancelledImportingPluginVmImage);
@@ -215,18 +215,18 @@
   return true;
 }
 
-gfx::Size PluginVmLauncherView::CalculatePreferredSize() const {
+gfx::Size PluginVmInstallerView::CalculatePreferredSize() const {
   return gfx::Size(kWindowWidth, kWindowHeight);
 }
 
-void PluginVmLauncherView::OnDlcDownloadStarted() {
+void PluginVmInstallerView::OnDlcDownloadStarted() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   state_ = State::DOWNLOADING_DLC;
   OnStateUpdated();
 }
 
-void PluginVmLauncherView::OnDlcDownloadProgressUpdated(
+void PluginVmInstallerView::OnDlcDownloadProgressUpdated(
     double progress,
     base::TimeDelta elapsed_time) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -235,21 +235,21 @@
   UpdateOperationProgress(progress * 100, 100.0, elapsed_time);
 }
 
-void PluginVmLauncherView::OnDlcDownloadCompleted() {
+void PluginVmInstallerView::OnDlcDownloadCompleted() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(state_, State::DOWNLOADING_DLC);
 
   state_ = State::START_DOWNLOADING;
   OnStateUpdated();
 
-  plugin_vm_image_manager_->StartDownload();
+  plugin_vm_installer_->StartDownload();
 }
 
-void PluginVmLauncherView::OnDlcDownloadCancelled() {
+void PluginVmInstallerView::OnDlcDownloadCancelled() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 }
 
-void PluginVmLauncherView::OnDownloadStarted() {
+void PluginVmInstallerView::OnDownloadStarted() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(state_, State::START_DOWNLOADING);
 
@@ -257,7 +257,7 @@
   OnStateUpdated();
 }
 
-void PluginVmLauncherView::OnDownloadProgressUpdated(
+void PluginVmInstallerView::OnDownloadProgressUpdated(
     uint64_t bytes_downloaded,
     int64_t content_length,
     base::TimeDelta elapsed_time) {
@@ -271,21 +271,21 @@
   UpdateOperationProgress(bytes_downloaded, content_length, elapsed_time);
 }
 
-void PluginVmLauncherView::OnDownloadCompleted() {
+void PluginVmInstallerView::OnDownloadCompleted() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(state_, State::DOWNLOADING);
 
-  plugin_vm_image_manager_->StartImport();
+  plugin_vm_installer_->StartImport();
   state_ = State::IMPORTING;
   OnStateUpdated();
 }
 
-void PluginVmLauncherView::OnDownloadCancelled() {
+void PluginVmInstallerView::OnDownloadCancelled() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 }
 
-void PluginVmLauncherView::OnDownloadFailed(
-    plugin_vm::PluginVmImageManager::FailureReason reason) {
+void PluginVmInstallerView::OnDownloadFailed(
+    plugin_vm::PluginVmInstaller::FailureReason reason) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   state_ = State::ERROR;
@@ -296,7 +296,7 @@
       plugin_vm::PluginVmSetupResult::kErrorDownloadingPluginVmImage);
 }
 
-void PluginVmLauncherView::OnImportProgressUpdated(
+void PluginVmInstallerView::OnImportProgressUpdated(
     int percent_completed,
     base::TimeDelta elapsed_time) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -305,12 +305,12 @@
   UpdateOperationProgress(percent_completed, 100.0, elapsed_time);
 }
 
-void PluginVmLauncherView::OnImportCancelled() {
+void PluginVmInstallerView::OnImportCancelled() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 }
 
-void PluginVmLauncherView::OnImportFailed(
-    plugin_vm::PluginVmImageManager::FailureReason reason) {
+void PluginVmInstallerView::OnImportFailed(
+    plugin_vm::PluginVmInstaller::FailureReason reason) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   state_ = State::ERROR;
@@ -321,7 +321,7 @@
       plugin_vm::PluginVmSetupResult::kErrorImportingPluginVmImage);
 }
 
-void PluginVmLauncherView::OnImported() {
+void PluginVmInstallerView::OnImported() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(state_, State::IMPORTING);
 
@@ -334,7 +334,7 @@
                                               setup_start_tick_);
 }
 
-base::string16 PluginVmLauncherView::GetBigMessage() const {
+base::string16 PluginVmInstallerView::GetBigMessage() const {
   switch (state_) {
     case State::START_DLC_DOWNLOADING:
     case State::DOWNLOADING_DLC:
@@ -342,38 +342,39 @@
     case State::DOWNLOADING:
     case State::IMPORTING:
       return l10n_util::GetStringUTF16(
-          IDS_PLUGIN_VM_LAUNCHER_ENVIRONMENT_SETTING_TITLE);
+          IDS_PLUGIN_VM_INSTALLER_ENVIRONMENT_SETTING_TITLE);
     case State::FINISHED:
-      return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_FINISHED_TITLE);
+      return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_FINISHED_TITLE);
     case State::ERROR:
       DCHECK(reason_);
       switch (*reason_) {
-        case plugin_vm::PluginVmImageManager::FailureReason::NOT_ALLOWED:
+        case plugin_vm::PluginVmInstaller::FailureReason::NOT_ALLOWED:
           return l10n_util::GetStringUTF16(
-              IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_TITLE);
+              IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_TITLE);
         default:
-          return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_ERROR_TITLE);
+          return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_ERROR_TITLE);
       }
   }
 }
 
-base::string16 PluginVmLauncherView::GetMessage() const {
+base::string16 PluginVmInstallerView::GetMessage() const {
   switch (state_) {
     case State::START_DLC_DOWNLOADING:
     case State::DOWNLOADING_DLC:
     case State::START_DOWNLOADING:
       return l10n_util::GetStringUTF16(
-          IDS_PLUGIN_VM_LAUNCHER_START_DOWNLOADING_MESSAGE);
+          IDS_PLUGIN_VM_INSTALLER_START_DOWNLOADING_MESSAGE);
     case State::DOWNLOADING:
       return l10n_util::GetStringUTF16(
-          IDS_PLUGIN_VM_LAUNCHER_DOWNLOADING_MESSAGE);
+          IDS_PLUGIN_VM_INSTALLER_DOWNLOADING_MESSAGE);
     case State::IMPORTING:
       return l10n_util::GetStringUTF16(
-          IDS_PLUGIN_VM_LAUNCHER_IMPORTING_MESSAGE);
+          IDS_PLUGIN_VM_INSTALLER_IMPORTING_MESSAGE);
     case State::FINISHED:
-      return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_FINISHED_MESSAGE);
+      return l10n_util::GetStringUTF16(
+          IDS_PLUGIN_VM_INSTALLER_FINISHED_MESSAGE);
     case State::ERROR:
-      using Reason = plugin_vm::PluginVmImageManager::FailureReason;
+      using Reason = plugin_vm::PluginVmInstaller::FailureReason;
       DCHECK(reason_);
       switch (*reason_) {
         default:
@@ -385,47 +386,47 @@
         case Reason::DISPATCHER_NOT_AVAILABLE:
         case Reason::CONCIERGE_NOT_AVAILABLE:
           return l10n_util::GetStringFUTF16(
-              IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_LOGIC_ERROR,
+              IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_LOGIC_ERROR,
               base::NumberToString16(
                   static_cast<std::underlying_type_t<Reason>>(*reason_)));
         case Reason::NOT_ALLOWED:
           return l10n_util::GetStringUTF16(
-              IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_MESSAGE);
+              IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE);
         case Reason::INVALID_IMAGE_URL:
         case Reason::HASH_MISMATCH:
           return l10n_util::GetStringFUTF16(
-              IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_CONFIG_ERROR,
+              IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_CONFIG_ERROR,
               base::NumberToString16(
                   static_cast<std::underlying_type_t<Reason>>(*reason_)));
         case Reason::DOWNLOAD_FAILED_UNKNOWN:
         case Reason::DOWNLOAD_FAILED_NETWORK:
         case Reason::DOWNLOAD_FAILED_ABORTED:
           return l10n_util::GetStringFUTF16(
-              IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_DOWNLOAD_FAILED,
+              IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_FAILED,
               base::NumberToString16(
                   static_cast<std::underlying_type_t<Reason>>(*reason_)));
         case Reason::COULD_NOT_OPEN_IMAGE:
         case Reason::INVALID_IMPORT_RESPONSE:
         case Reason::IMAGE_IMPORT_FAILED:
           return l10n_util::GetStringFUTF16(
-              IDS_PLUGIN_VM_LAUNCHER_ERROR_MESSAGE_INSTALLING_FAILED,
+              IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_INSTALLING_FAILED,
               base::NumberToString16(
                   static_cast<std::underlying_type_t<Reason>>(*reason_)));
       }
   }
 }
 
-void PluginVmLauncherView::SetFinishedCallbackForTesting(
+void PluginVmInstallerView::SetFinishedCallbackForTesting(
     base::OnceCallback<void(bool success)> callback) {
   finished_callback_for_testing_ = std::move(callback);
 }
 
-PluginVmLauncherView::~PluginVmLauncherView() {
-  plugin_vm_image_manager_->RemoveObserver();
-  g_plugin_vm_launcher_view = nullptr;
+PluginVmInstallerView::~PluginVmInstallerView() {
+  plugin_vm_installer_->RemoveObserver();
+  g_plugin_vm_installer_view = nullptr;
 }
 
-int PluginVmLauncherView::GetCurrentDialogButtons() const {
+int PluginVmInstallerView::GetCurrentDialogButtons() const {
   switch (state_) {
     case State::START_DLC_DOWNLOADING:
     case State::DOWNLOADING_DLC:
@@ -438,7 +439,7 @@
     case State::ERROR:
       DCHECK(reason_);
       switch (*reason_) {
-        case plugin_vm::PluginVmImageManager::FailureReason::NOT_ALLOWED:
+        case plugin_vm::PluginVmInstaller::FailureReason::NOT_ALLOWED:
           return ui::DIALOG_BUTTON_CANCEL;
         default:
           return ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
@@ -446,7 +447,7 @@
   }
 }
 
-base::string16 PluginVmLauncherView::GetCurrentDialogButtonLabel(
+base::string16 PluginVmInstallerView::GetCurrentDialogButtonLabel(
     ui::DialogButton button) const {
   switch (state_) {
     case State::START_DLC_DOWNLOADING:
@@ -459,31 +460,31 @@
     }
     case State::FINISHED: {
       DCHECK_EQ(button, ui::DIALOG_BUTTON_OK);
-      return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_LAUNCH_BUTTON);
+      return l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_LAUNCH_BUTTON);
     }
     case State::ERROR: {
       DCHECK(reason_);
       switch (*reason_) {
-        case plugin_vm::PluginVmImageManager::FailureReason::NOT_ALLOWED:
+        case plugin_vm::PluginVmInstaller::FailureReason::NOT_ALLOWED:
           DCHECK_EQ(button, ui::DIALOG_BUTTON_CANCEL);
           return l10n_util::GetStringUTF16(IDS_APP_CANCEL);
         default:
           return l10n_util::GetStringUTF16(
               button == ui::DIALOG_BUTTON_OK
-                  ? IDS_PLUGIN_VM_LAUNCHER_RETRY_BUTTON
+                  ? IDS_PLUGIN_VM_INSTALLER_RETRY_BUTTON
                   : IDS_APP_CANCEL);
       }
     }
   }
 }
 
-void PluginVmLauncherView::AddedToWidget() {
+void PluginVmInstallerView::AddedToWidget() {
   // Defensive check that ensures an error message is shown if this
   // dialogue is reached somehow although PluginVm has been disabled.
   if (!plugin_vm::IsPluginVmAllowedForProfile(profile_)) {
     LOG(ERROR) << "PluginVm is disallowed by policy. Showing error screen.";
     state_ = State::ERROR;
-    reason_ = plugin_vm::PluginVmImageManager::FailureReason::NOT_ALLOWED;
+    reason_ = plugin_vm::PluginVmInstaller::FailureReason::NOT_ALLOWED;
     plugin_vm::RecordPluginVmSetupResultHistogram(
         plugin_vm::PluginVmSetupResult::kPluginVmIsNotAllowed);
   }
@@ -494,7 +495,7 @@
     OnStateUpdated();
 }
 
-void PluginVmLauncherView::OnStateUpdated() {
+void PluginVmInstallerView::OnStateUpdated() {
   // TODO(https://crbug.com/1017511): display failure reasons.
   SetBigMessageLabel();
   SetMessageLabel();
@@ -538,7 +539,7 @@
   }
 }
 
-base::string16 PluginVmLauncherView::GetDownloadProgressMessage(
+base::string16 PluginVmInstallerView::GetDownloadProgressMessage(
     uint64_t bytes_downloaded,
     int64_t content_length) const {
   DCHECK_EQ(state_, State::DOWNLOADING);
@@ -549,20 +550,20 @@
   // If download size isn't known |fraction_complete| should be empty.
   if (fraction_complete.has_value()) {
     return l10n_util::GetStringFUTF16(
-        IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_MESSAGE,
+        IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_MESSAGE,
         ui::FormatBytesWithUnits(bytes_downloaded, ui::DATA_UNITS_GIBIBYTE,
                                  /*show_units=*/false),
         ui::FormatBytesWithUnits(content_length, ui::DATA_UNITS_GIBIBYTE,
                                  /*show_units=*/true));
   } else {
     return l10n_util::GetStringFUTF16(
-        IDS_PLUGIN_VM_LAUNCHER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE,
+        IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE,
         ui::FormatBytesWithUnits(bytes_downloaded, ui::DATA_UNITS_GIBIBYTE,
                                  /*show_units=*/true));
   }
 }
 
-void PluginVmLauncherView::UpdateOperationProgress(
+void PluginVmInstallerView::UpdateOperationProgress(
     double units_processed,
     double total_units,
     base::TimeDelta elapsed_time) const {
@@ -593,33 +594,33 @@
       ax::mojom::Event::kTextChanged, true);
 }
 
-void PluginVmLauncherView::SetBigMessageLabel() {
+void PluginVmInstallerView::SetBigMessageLabel() {
   big_message_label_->SetText(GetBigMessage());
   big_message_label_->SetVisible(true);
   big_message_label_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged,
                                                true);
 }
 
-void PluginVmLauncherView::SetMessageLabel() {
+void PluginVmInstallerView::SetMessageLabel() {
   message_label_->SetText(GetMessage());
   message_label_->SetVisible(true);
   message_label_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged,
                                            true);
 }
 
-void PluginVmLauncherView::SetBigImage() {
+void PluginVmInstallerView::SetBigImage() {
   if (state_ == State::ERROR) {
     big_image_->SetImage(
         ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-            IDR_PLUGIN_VM_LAUNCHER_ERROR));
+            IDR_PLUGIN_VM_INSTALLER_ERROR));
     return;
   }
   big_image_->SetImage(
       ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-          IDR_PLUGIN_VM_LAUNCHER));
+          IDR_PLUGIN_VM_INSTALLER));
 }
 
-void PluginVmLauncherView::StartPluginVmImageDownload() {
+void PluginVmInstallerView::StartPluginVmImageDownload() {
   // In each case setup starts from this function (when dialog is opened or
   // retry button is clicked).
   setup_start_tick_ = base::TimeTicks::Now();
@@ -627,6 +628,6 @@
   state_ = State::START_DLC_DOWNLOADING;
   OnStateUpdated();
 
-  plugin_vm_image_manager_->SetObserver(this);
-  plugin_vm_image_manager_->StartDlcDownload();
+  plugin_vm_installer_->SetObserver(this);
+  plugin_vm_installer_->StartDlcDownload();
 }
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h
similarity index 74%
rename from chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h
rename to chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h
index cf276d79..6150b02 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_VIEWS_PLUGIN_VM_PLUGIN_VM_LAUNCHER_VIEW_H_
-#define CHROME_BROWSER_UI_VIEWS_PLUGIN_VM_PLUGIN_VM_LAUNCHER_VIEW_H_
+#ifndef CHROME_BROWSER_UI_VIEWS_PLUGIN_VM_PLUGIN_VM_INSTALLER_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_PLUGIN_VM_PLUGIN_VM_INSTALLER_VIEW_H_
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_manager.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 namespace views {
@@ -18,16 +18,13 @@
 
 class Profile;
 
-// The PluginVm launcher that is shown to user if PluginVm icon is clicked, but
-// PluginVm is not yet ready to be launched. This class is responsible for
-// triggering the steps of the PluginVm setup process and displaying progress
-// according to the state of this setup.
-class PluginVmLauncherView : public views::BubbleDialogDelegateView,
-                             public plugin_vm::PluginVmImageManager::Observer {
+// The front end for Plugin VM, shown the first time the user launches it.
+class PluginVmInstallerView : public views::BubbleDialogDelegateView,
+                              public plugin_vm::PluginVmInstaller::Observer {
  public:
-  explicit PluginVmLauncherView(Profile* profile);
+  explicit PluginVmInstallerView(Profile* profile);
 
-  static PluginVmLauncherView* GetActiveViewForTesting();
+  static PluginVmInstallerView* GetActiveViewForTesting();
 
   // views::BubbleDialogDelegateView implementation.
   bool ShouldShowWindowTitle() const override;
@@ -48,13 +45,13 @@
   void OnDownloadCompleted() override;
   void OnDownloadCancelled() override;
   void OnDownloadFailed(
-      plugin_vm::PluginVmImageManager::FailureReason reason) override;
+      plugin_vm::PluginVmInstaller::FailureReason reason) override;
   void OnImportProgressUpdated(int percent_completed,
                                base::TimeDelta elapsed_time) override;
   void OnImported() override;
   void OnImportCancelled() override;
   void OnImportFailed(
-      plugin_vm::PluginVmImageManager::FailureReason reason) override;
+      plugin_vm::PluginVmInstaller::FailureReason reason) override;
 
   // Public for testing purposes.
   base::string16 GetBigMessage() const;
@@ -74,7 +71,7 @@
     ERROR,              // Something unexpected happened.
   };
 
-  ~PluginVmLauncherView() override;
+  ~PluginVmInstallerView() override;
 
   int GetCurrentDialogButtons() const;
   base::string16 GetCurrentDialogButtonLabel(ui::DialogButton button) const;
@@ -96,7 +93,7 @@
   void StartPluginVmImageDownload();
 
   Profile* profile_ = nullptr;
-  plugin_vm::PluginVmImageManager* plugin_vm_image_manager_ = nullptr;
+  plugin_vm::PluginVmInstaller* plugin_vm_installer_ = nullptr;
   views::Label* big_message_label_ = nullptr;
   views::Label* message_label_ = nullptr;
   views::ProgressBar* progress_bar_ = nullptr;
@@ -106,11 +103,11 @@
   base::TimeTicks setup_start_tick_;
 
   State state_ = State::START_DOWNLOADING;
-  base::Optional<plugin_vm::PluginVmImageManager::FailureReason> reason_;
+  base::Optional<plugin_vm::PluginVmInstaller::FailureReason> reason_;
 
   base::OnceCallback<void(bool success)> finished_callback_for_testing_;
 
-  DISALLOW_COPY_AND_ASSIGN(PluginVmLauncherView);
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstallerView);
 };
 
-#endif  // CHROME_BROWSER_UI_VIEWS_PLUGIN_VM_PLUGIN_VM_LAUNCHER_VIEW_H_
+#endif  // CHROME_BROWSER_UI_VIEWS_PLUGIN_VM_PLUGIN_VM_INSTALLER_VIEW_H_
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view_browsertest.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
similarity index 85%
rename from chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view_browsertest.cc
rename to chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
index 1deca108..7771f95 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view_browsertest.cc
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h"
+#include "chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h"
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
@@ -49,9 +49,9 @@
 
 }  // namespace
 
-class PluginVmLauncherViewBrowserTest : public DialogBrowserTest {
+class PluginVmInstallerViewBrowserTest : public DialogBrowserTest {
  public:
-  PluginVmLauncherViewBrowserTest() = default;
+  PluginVmInstallerViewBrowserTest() = default;
 
   void SetUpOnMainThread() override {
     ASSERT_TRUE(embedded_test_server()->Start());
@@ -66,8 +66,8 @@
 
   // DialogBrowserTest:
   void ShowUi(const std::string& name) override {
-    plugin_vm::ShowPluginVmLauncherView(browser()->profile());
-    view_ = PluginVmLauncherView::GetActiveViewForTesting();
+    plugin_vm::ShowPluginVmInstallerView(browser()->profile());
+    view_ = PluginVmInstallerView::GetActiveViewForTesting();
   }
 
  protected:
@@ -97,16 +97,16 @@
     EXPECT_TRUE(HasCancelButton());
     EXPECT_EQ(
         view_->GetBigMessage(),
-        l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_TITLE));
+        l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_TITLE));
     EXPECT_EQ(
         view_->GetMessage(),
-        l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_NOT_ALLOWED_MESSAGE));
+        l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE));
   }
 
   void WaitForSetupToFinish() {
     base::RunLoop run_loop;
     view_->SetFinishedCallbackForTesting(
-        base::BindOnce(&PluginVmLauncherViewBrowserTest::OnSetupFinished,
+        base::BindOnce(&PluginVmInstallerViewBrowserTest::OnSetupFinished,
                        run_loop.QuitClosure()));
 
     run_loop.Run();
@@ -117,25 +117,26 @@
     EXPECT_TRUE(HasAcceptButton());
     EXPECT_TRUE(HasCancelButton());
     EXPECT_EQ(view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK),
-              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_RETRY_BUTTON));
+              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_RETRY_BUTTON));
     EXPECT_EQ(view_->GetBigMessage(),
-              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_ERROR_TITLE));
+              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_ERROR_TITLE));
   }
 
   void CheckSetupIsFinishedSuccessfully() {
     EXPECT_TRUE(HasAcceptButton());
     EXPECT_FALSE(HasCancelButton());
     EXPECT_EQ(view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK),
-              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_LAUNCH_BUTTON));
-    EXPECT_EQ(view_->GetBigMessage(),
-              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_LAUNCHER_FINISHED_TITLE));
+              l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_LAUNCH_BUTTON));
+    EXPECT_EQ(
+        view_->GetBigMessage(),
+        l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_FINISHED_TITLE));
   }
 
   chromeos::ScopedTestingCrosSettings scoped_testing_cros_settings_;
   chromeos::ScopedStubInstallAttributes scoped_stub_install_attributes_;
 
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
-  PluginVmLauncherView* view_;
+  PluginVmInstallerView* view_;
   std::unique_ptr<base::HistogramTester> histogram_tester_;
   chromeos::FakeConciergeClient* fake_concierge_client_;
 
@@ -169,13 +170,13 @@
                                                   std::move(quit_closure));
   }
 
-  DISALLOW_COPY_AND_ASSIGN(PluginVmLauncherViewBrowserTest);
+  DISALLOW_COPY_AND_ASSIGN(PluginVmInstallerViewBrowserTest);
 };
 
-class PluginVmLauncherViewBrowserTestWithFeatureEnabled
-    : public PluginVmLauncherViewBrowserTest {
+class PluginVmInstallerViewBrowserTestWithFeatureEnabled
+    : public PluginVmInstallerViewBrowserTest {
  public:
-  PluginVmLauncherViewBrowserTestWithFeatureEnabled() {
+  PluginVmInstallerViewBrowserTestWithFeatureEnabled() {
     feature_list_.InitAndEnableFeature(features::kPluginVm);
   }
 
@@ -184,11 +185,11 @@
 };
 
 // Test the dialog is actually can be launched.
-IN_PROC_BROWSER_TEST_F(PluginVmLauncherViewBrowserTest, InvokeUi_default) {
+IN_PROC_BROWSER_TEST_F(PluginVmInstallerViewBrowserTest, InvokeUi_default) {
   ShowAndVerifyUi();
 }
 
-IN_PROC_BROWSER_TEST_F(PluginVmLauncherViewBrowserTestWithFeatureEnabled,
+IN_PROC_BROWSER_TEST_F(PluginVmInstallerViewBrowserTestWithFeatureEnabled,
                        SetupShouldFinishSuccessfully) {
   AllowPluginVm();
   plugin_vm::SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
@@ -205,7 +206,7 @@
       plugin_vm::PluginVmSetupResult::kSuccess, 1);
 }
 
-IN_PROC_BROWSER_TEST_F(PluginVmLauncherViewBrowserTestWithFeatureEnabled,
+IN_PROC_BROWSER_TEST_F(PluginVmInstallerViewBrowserTestWithFeatureEnabled,
                        SetupShouldFailAsHashesDoNotMatch) {
   AllowPluginVm();
   // Reset PluginVmImage hash to non-matching.
@@ -224,7 +225,7 @@
       plugin_vm::PluginVmSetupResult::kErrorDownloadingPluginVmImage, 1);
 }
 
-IN_PROC_BROWSER_TEST_F(PluginVmLauncherViewBrowserTestWithFeatureEnabled,
+IN_PROC_BROWSER_TEST_F(PluginVmInstallerViewBrowserTestWithFeatureEnabled,
                        SetupShouldFailAsImportingFails) {
   AllowPluginVm();
   SetPluginVmImagePref(embedded_test_server()->GetURL(kJpgFile).spec(),
@@ -242,7 +243,7 @@
       plugin_vm::PluginVmSetupResult::kErrorImportingPluginVmImage, 1);
 }
 
-IN_PROC_BROWSER_TEST_F(PluginVmLauncherViewBrowserTestWithFeatureEnabled,
+IN_PROC_BROWSER_TEST_F(PluginVmInstallerViewBrowserTestWithFeatureEnabled,
                        CouldRetryAfterFailedSetup) {
   AllowPluginVm();
   // Reset PluginVmImage hash to non-matching.
@@ -276,7 +277,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(
-    PluginVmLauncherViewBrowserTest,
+    PluginVmInstallerViewBrowserTest,
     SetupShouldShowDisallowedMessageIfPluginVmIsNotAllowedToRun) {
   ShowUi("default");
   EXPECT_NE(nullptr, view_);
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
index b168514c..86f9e30b 100644
--- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
+++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -29,6 +29,7 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/geometry/insets.h"
+#include "ui/native_theme/native_theme.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/button/label_button.h"
 #include "ui/views/controls/label.h"
@@ -170,12 +171,15 @@
 void TabGroupEditorBubbleView::InitColorSet() {
   base::flat_map<tab_groups::TabGroupColorId, tab_groups::TabGroupColor>
       all_colors = tab_groups::GetTabGroupColorSet();
+  ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi();
 
   color_ids_.reserve(all_colors.size());
   colors_.reserve(all_colors.size());
   for (auto const color_pair : all_colors) {
     color_ids_.push_back(color_pair.first);
-    SkColor color = tab_controller_->GetPaintedGroupColor(color_pair.first);
+    SkColor color = native_theme->ShouldUseDarkColors()
+                        ? color_pair.second.dark_theme_color
+                        : color_pair.second.light_theme_color;
     colors_.push_back({color, color_pair.second.label});
   }
 }
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc
index 0876c81..d14e7514 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -94,7 +94,9 @@
       // Show tabs for Terminals only.
       // TODO(crbug.com/846546): Generalise has_tab_strip_ as a SystemWebApp
       // capability.
-      has_tab_strip_(system_app_type_ == SystemAppType::TERMINAL) {
+      has_tab_strip_(
+          base::FeatureList::IsEnabled(features::kDesktopPWAsTabStrip) ||
+          system_app_type_ == SystemAppType::TERMINAL) {
   browser->tab_strip_model()->AddObserver(this);
 }
 
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
index 4072121..f2b11b2 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
@@ -13,11 +13,13 @@
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
 #include "chrome/browser/installable/installable_metrics.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/web_applications/components/install_manager.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_install_utils.h"
+#include "chrome/browser/web_applications/components/web_app_utils.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/web_application_info.h"
@@ -65,17 +67,22 @@
 bool CanCreateWebApp(const Browser* browser) {
   content::WebContents* web_contents =
       browser->tab_strip_model()->GetActiveWebContents();
-  auto* provider = WebAppProvider::GetForWebContents(web_contents);
-  if (!provider)
+  if (!WebAppProvider::GetForWebContents(web_contents))
     return false;
+  Profile* web_contents_profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
 
-  return provider->install_manager().CanInstallWebApp(web_contents);
+  return AreWebAppsUserInstallable(web_contents_profile) &&
+         IsValidWebAppUrl(web_contents->GetLastCommittedURL());
 }
 
-void CreateWebAppFromCurrentWebContents(
-    Browser* browser,
-    bool force_shortcut_app,
-    WebAppInstalledCallback installed_callback) {
+bool CanPopOutWebApp(Profile* profile) {
+  return AreWebAppsEnabled(profile) && !profile->IsGuestSession() &&
+         !profile->IsOffTheRecord();
+}
+
+void CreateWebAppFromCurrentWebContents(Browser* browser,
+                                        bool force_shortcut_app) {
   DCHECK(CanCreateWebApp(browser));
 
   content::WebContents* web_contents =
@@ -89,7 +96,8 @@
   provider->install_manager().InstallWebAppFromManifestWithFallback(
       web_contents, force_shortcut_app, install_source,
       base::BindOnce(WebAppInstallDialogCallback, install_source),
-      base::BindOnce(OnWebAppInstalled, std::move(installed_callback)));
+      base::BindOnce(OnWebAppInstalled,
+                     base::DoNothing::Once<const AppId&, InstallResultCode>()));
 }
 
 bool CreateWebAppFromManifest(content::WebContents* web_contents,
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.h b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
index c595a25..5f350a4f 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_utils.h
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
@@ -10,6 +10,7 @@
 
 enum class WebappInstallSource;
 class Browser;
+class Profile;
 
 namespace content {
 class WebContents;
@@ -22,17 +23,22 @@
 // TODO(loyso): Rework these functions (API). Move all of them into
 // WebAppDialogManager.
 
-// Returns true if a WebApp installation is allowed for the current page.
+// Returns whether a WebApp installation is allowed for the current page.
 bool CanCreateWebApp(const Browser* browser);
 
+// Returns whether the current profile is allowed to pop out a web app into a
+// separate window. Does not check whether any particular page can pop out.
+bool CanPopOutWebApp(Profile* profile);
+
 using WebAppInstalledCallback =
     base::OnceCallback<void(const AppId& app_id, InstallResultCode code)>;
 
-// Initiates install of a WebApp for the current page.
-void CreateWebAppFromCurrentWebContents(
-    Browser* browser,
-    bool force_shortcut_app,
-    WebAppInstalledCallback installed_callback);
+// Initiates user install of a WebApp for the current page.
+// If |force_shortcut_app| is true, the current page will be installed even if
+// the site does not meet installability requirements (see
+// |AppBannerManager::PerformInstallableCheck|).
+void CreateWebAppFromCurrentWebContents(Browser* browser,
+                                        bool force_shortcut_app);
 
 // Starts install of a WebApp for a given |web_contents|, initiated from
 // a promotional banner or omnibox install icon.
diff --git a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
index 6ab1872..162d3019 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
@@ -98,7 +98,7 @@
   source->AddResourcePath("images/success_illustration.png",
                           IDR_LINUX_ILLUSTRATION);
   source->AddResourcePath("images/error_illustration.png",
-                          IDR_PLUGIN_VM_LAUNCHER_ERROR);
+                          IDR_PLUGIN_VM_INSTALLER_ERROR);
   source->AddResourcePath("app.js", IDR_CROSTINI_UPGRADER_APP_JS);
   source->AddResourcePath("browser_proxy.js",
                           IDR_CROSTINI_UPGRADER_BROWSER_PROXY_JS);
diff --git a/chrome/browser/ui/webui/cookies_tree_model_util.cc b/chrome/browser/ui/webui/cookies_tree_model_util.cc
index 0873e01..c607734 100644
--- a/chrome/browser/ui/webui/cookies_tree_model_util.cc
+++ b/chrome/browser/ui/webui/cookies_tree_model_util.cc
@@ -19,7 +19,6 @@
 #include "chrome/browser/browsing_data/cookies_tree_model.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/cache_storage_context.h"
-#include "content/public/browser/indexed_db_context.h"
 #include "content/public/browser/service_worker_context.h"
 #include "content/public/browser/storage_usage_info.h"
 #include "extensions/buildflags/buildflags.h"
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index eafd7872..b22fa83 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -168,6 +168,7 @@
     {"stopActivityStream", IDS_EXTENSIONS_STOP_ACTIVITY_STREAM},
     {"emptyStreamStarted", IDS_EXTENSIONS_EMPTY_STREAM_STARTED},
     {"emptyStreamStopped", IDS_EXTENSIONS_EMPTY_STREAM_STOPPED},
+    {"enableButton", IDS_EXTENSIONS_ENABLE_BUTTON},
     {"activityArgumentsHeading", IDS_EXTENSIONS_ACTIVITY_ARGUMENTS_HEADING},
     {"webRequestInfoHeading", IDS_EXTENSIONS_WEB_REQUEST_INFO_HEADING},
     {"activityLogMoreActionsLabel",
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index a4fe51f..ee152aa5 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -225,9 +225,7 @@
 #endif
 
 #if defined(OS_CHROMEOS)
-  // TODO(950007): Remove this when SplitSettings is the default and there are
-  // no Chrome OS settings in the browser settings page.
-  InitOSWebUIHandlers(profile, web_ui, html_source);
+  InitBrowserSettingsWebUIHandlers(profile, web_ui, html_source);
 #else
   AddSettingsPageUIHandler(std::make_unique<DefaultBrowserHandler>());
   AddSettingsPageUIHandler(std::make_unique<ManageProfileHandler>(profile));
@@ -327,6 +325,57 @@
 
 #if defined(OS_CHROMEOS)
 // static
+void SettingsUI::InitBrowserSettingsWebUIHandlers(
+    Profile* profile,
+    content::WebUI* web_ui,
+    content::WebUIDataSource* html_source) {
+  // TODO(jamescook): Sort out how account management is split between Chrome OS
+  // and browser settings.
+  if (chromeos::IsAccountManagerAvailable(profile)) {
+    chromeos::AccountManagerFactory* factory =
+        g_browser_process->platform_part()->GetAccountManagerFactory();
+    chromeos::AccountManager* account_manager =
+        factory->GetAccountManager(profile->GetPath().value());
+    DCHECK(account_manager);
+
+    web_ui->AddMessageHandler(
+        std::make_unique<chromeos::settings::AccountManagerUIHandler>(
+            account_manager, IdentityManagerFactory::GetForProfile(profile)));
+  }
+
+  if (!profile->IsGuestSession()) {
+    chromeos::android_sms::AndroidSmsService* android_sms_service =
+        chromeos::android_sms::AndroidSmsServiceFactory::GetForBrowserContext(
+            profile);
+    web_ui->AddMessageHandler(
+        std::make_unique<chromeos::settings::MultideviceHandler>(
+            profile->GetPrefs(),
+            chromeos::multidevice_setup::MultiDeviceSetupClientFactory::
+                GetForProfile(profile),
+            android_sms_service
+                ? android_sms_service->android_sms_pairing_state_tracker()
+                : nullptr,
+            android_sms_service ? android_sms_service->android_sms_app_manager()
+                                : nullptr));
+    if (chromeos::settings::ShouldShowParentalControls(profile)) {
+      web_ui->AddMessageHandler(
+          std::make_unique<chromeos::settings::ParentalControlsHandler>(
+              profile));
+    }
+  }
+
+  web_ui->AddMessageHandler(
+      std::make_unique<chromeos::settings::AndroidAppsHandler>(profile));
+
+  html_source->AddBoolean(
+      "userCannotManuallyEnterPassword",
+      !chromeos::password_visibility::AccountHasUserFacingPassword(
+          chromeos::ProfileHelper::Get()
+              ->GetUserByProfile(profile)
+              ->GetAccountId()));
+}
+
+// static
 void SettingsUI::InitOSWebUIHandlers(Profile* profile,
                                      content::WebUI* web_ui,
                                      content::WebUIDataSource* html_source) {
@@ -434,12 +483,6 @@
   html_source->AddBoolean(
       "quickUnlockDisabledByPolicy",
       chromeos::quick_unlock::IsPinDisabledByPolicy(profile->GetPrefs()));
-  html_source->AddBoolean(
-      "userCannotManuallyEnterPassword",
-      !chromeos::password_visibility::AccountHasUserFacingPassword(
-          chromeos::ProfileHelper::Get()
-              ->GetUserByProfile(profile)
-              ->GetAccountId()));
   const bool fingerprint_unlock_enabled =
       chromeos::quick_unlock::IsFingerprintEnabled(profile);
   html_source->AddBoolean("fingerprintUnlockEnabled",
diff --git a/chrome/browser/ui/webui/settings/settings_ui.h b/chrome/browser/ui/webui/settings/settings_ui.h
index c606ab2c..b1d14a39 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.h
+++ b/chrome/browser/ui/webui/settings/settings_ui.h
@@ -45,6 +45,13 @@
   ~SettingsUI() override;
 
 #if defined(OS_CHROMEOS)
+  // Initializes the WebUI message handlers for CrOS-specific settings that are
+  // still shown in the browser settings UI.
+  static void InitBrowserSettingsWebUIHandlers(
+      Profile* profile,
+      content::WebUI* web_ui,
+      content::WebUIDataSource* html_source);
+
   // Initializes the WebUI message handlers for OS-specific settings.
   static void InitOSWebUIHandlers(Profile* profile,
                                   content::WebUI* web_ui,
diff --git a/chrome/browser/vr/test/gl_test_environment_unittest.cc b/chrome/browser/vr/test/gl_test_environment_unittest.cc
index a7d07bd5..ee62da2 100644
--- a/chrome/browser/vr/test/gl_test_environment_unittest.cc
+++ b/chrome/browser/vr/test/gl_test_environment_unittest.cc
@@ -9,14 +9,7 @@
 
 namespace vr {
 
-// Failing on Win7 Tests (dbg)(1). crbug.com/1035767
-#if defined(OS_WIN)
-#define MAYBE_InitializeAndCleanup DISABLED_InitializeAndCleanup
-#else
-#define MAYBE_InitializeAndCleanup InitializeAndCleanup
-#endif
-
-TEST(GlTestEnvironmentTest, MAYBE_InitializeAndCleanup) {
+TEST(GlTestEnvironmentTest, InitializeAndCleanup) {
   GlTestEnvironment gl_test_environment(gfx::Size(100, 100));
   EXPECT_NE(gl_test_environment.GetFrameBufferForTesting(), 0u);
   EXPECT_EQ(glGetError(), (GLenum)GL_NO_ERROR);
diff --git a/chrome/browser/vr/ui_pixeltest.cc b/chrome/browser/vr/ui_pixeltest.cc
index 07668d20..b377c73 100644
--- a/chrome/browser/vr/ui_pixeltest.cc
+++ b/chrome/browser/vr/ui_pixeltest.cc
@@ -18,14 +18,7 @@
 
 }  // namespace
 
-// Failing on Win7 Tests (dbg)(1). crbug.com/1035767
-#if defined(OS_WIN)
-#define MAYBE_DrawVrBrowsingMode DISABLED_DrawVrBrowsingMode
-#else
-#define MAYBE_DrawVrBrowsingMode DrawVrBrowsingMode
-#endif
-
-TEST_F(UiPixelTest, MAYBE_DrawVrBrowsingMode) {
+TEST_F(UiPixelTest, DrawVrBrowsingMode) {
   // Set up scene.
   UiInitialState ui_initial_state;
   ui_initial_state.in_web_vr = false;
diff --git a/chrome/browser/web_applications/components/install_manager.h b/chrome/browser/web_applications/components/install_manager.h
index 476c73a..bf5e2b1 100644
--- a/chrome/browser/web_applications/components/install_manager.h
+++ b/chrome/browser/web_applications/components/install_manager.h
@@ -67,9 +67,6 @@
       InstallableCheckResult result,
       base::Optional<AppId> app_id)>;
 
-  // Returns true if a web app can be installed for a given |web_contents|.
-  virtual bool CanInstallWebApp(content::WebContents* web_contents) = 0;
-
   // Checks a WebApp installability, retrieves manifest and icons and
   // than performs the actual installation.
   virtual void InstallWebAppFromManifest(
diff --git a/chrome/browser/web_applications/web_app_install_manager.cc b/chrome/browser/web_applications/web_app_install_manager.cc
index 1ca2fef..ac048a1 100644
--- a/chrome/browser/web_applications/web_app_install_manager.cc
+++ b/chrome/browser/web_applications/web_app_install_manager.cc
@@ -32,15 +32,6 @@
 
 WebAppInstallManager::~WebAppInstallManager() = default;
 
-bool WebAppInstallManager::CanInstallWebApp(
-    content::WebContents* web_contents) {
-  Profile* web_contents_profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
-
-  return AreWebAppsUserInstallable(web_contents_profile) &&
-         IsValidWebAppUrl(web_contents->GetLastCommittedURL());
-}
-
 void WebAppInstallManager::LoadWebAppAndCheckInstallability(
     const GURL& web_app_url,
     WebappInstallSource install_source,
diff --git a/chrome/browser/web_applications/web_app_install_manager.h b/chrome/browser/web_applications/web_app_install_manager.h
index fc791e61..4e0ea2a 100644
--- a/chrome/browser/web_applications/web_app_install_manager.h
+++ b/chrome/browser/web_applications/web_app_install_manager.h
@@ -37,7 +37,6 @@
   ~WebAppInstallManager() override;
 
   // InstallManager:
-  bool CanInstallWebApp(content::WebContents* web_contents) override;
   void LoadWebAppAndCheckInstallability(
       const GURL& web_app_url,
       WebappInstallSource install_source,
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 1780a246..57f6d6a 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/common/chrome_features.h"
 
-#include <vector>
+#include <array>
 
 #include "base/command_line.h"
 #include "base/no_destructor.h"
@@ -262,6 +262,10 @@
 const base::Feature kDesktopPWAsLocalUpdating{"DesktopPWAsLocalUpdating",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Adds a tab strip to PWA windows, used for UI experimentation.
+const base::Feature kDesktopPWAsTabStrip{"DesktopPWAsTabStrip",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables or disables use of new Desktop PWAs browser controller (that uses the
 // universal web_app::AppRegistrar) by extensions-based bookmark apps. Note that
 // the new Desktop PWAs implementation (not based on extensions) always uses the
@@ -737,23 +741,12 @@
     "HeavyAdPrivacyMitigations", base::FEATURE_ENABLED_BY_DEFAULT};
 
 #if defined(OS_ANDROID)
-const base::Feature kUseDisplayWideColorGamut{"UseDisplayWideColorGamut",
-                                              base::FEATURE_ENABLED_BY_DEFAULT};
-
 bool UseDisplayWideColorGamut() {
   auto compute_use_display_wide_color_gamut = []() {
-    // Enabled this feature for devices listed in "enabled_models" field trial
-    // param. This is a comma separated list.
-    std::string enabled_models_list = base::GetFieldTrialParamValueByFeature(
-        kUseDisplayWideColorGamut, "enabled_models");
-    if (enabled_models_list.empty())
-      return false;
-
     const char* current_model =
         base::android::BuildInfo::GetInstance()->model();
-    std::vector<std::string> enabled_models =
-        base::SplitString(enabled_models_list, ",", base::KEEP_WHITESPACE,
-                          base::SPLIT_WANT_NONEMPTY);
+    const std::array<std::string, 2> enabled_models = {
+        std::string{"Pixel 4"}, std::string{"Pixel 4 XL"}};
     for (const std::string& model : enabled_models) {
       if (model == current_model)
         return true;
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 99d52f6..7c28491e 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -147,6 +147,9 @@
 extern const base::Feature kDesktopPWAsLocalUpdating;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kDesktopPWAsTabStrip;
+
+COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDesktopPWAsUnifiedUiController;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json
index 0c62cd8..58b2920 100644
--- a/chrome/common/extensions/api/_api_features.json
+++ b/chrome/common/extensions/api/_api_features.json
@@ -107,9 +107,6 @@
     "channel": "stable",
     "contexts": ["webui"],
     "matches": [
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
       "chrome://settings/*"
     ]
   }],
@@ -631,9 +628,6 @@
     "channel": "stable",
     "contexts": ["webui"],
     "matches": [
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
       "chrome://settings/*"
     ]
   }],
@@ -687,8 +681,6 @@
     "contexts": ["webui"],
     "matches": [
       "chrome://multidevice-setup/*",
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
       "chrome://os-settings/*",
       "chrome://settings/*",
       "chrome://oobe/*"
@@ -724,8 +716,6 @@
     "channel": "stable",
     "contexts": ["webui"],
     "matches": [
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
       "chrome://os-settings/*",
       "chrome://settings/*"
     ]
@@ -792,10 +782,7 @@
     "channel": "stable",
     "contexts": ["webui"],
     "matches": [
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
-      "chrome://settings/*"
+      "chrome://os-settings/*"
     ]
   }],
   "virtualKeyboardPrivate": {
diff --git a/chrome/common/extensions/permissions/permissions_data_unittest.cc b/chrome/common/extensions/permissions/permissions_data_unittest.cc
index 3b81c5e4..55f9005 100644
--- a/chrome/common/extensions/permissions/permissions_data_unittest.cc
+++ b/chrome/common/extensions/permissions/permissions_data_unittest.cc
@@ -923,12 +923,14 @@
   URLPatternSet default_allowed;
   default_blocked.AddPattern(example_com_pattern);
   default_allowed.AddPattern(test_example_com_pattern);
+  int context_id = 7;
 
   // Test <all_urls> for regular extensions.
   scoped_refptr<Extension> extension =
       LoadManifestStrict("script_and_capture", "extension_regular_all.json");
-  extension->permissions_data()->SetDefaultPolicyHostRestrictions(
-      default_blocked, default_allowed);
+  extension->permissions_data()->SetUsesDefaultHostRestrictions(context_id);
+  PermissionsData::SetDefaultPolicyHostRestrictions(context_id, default_blocked,
+                                                    default_allowed);
 
   // The default policy applies to all extensions at this point. The extension
   // should be able to access test.example.com but be blocked from
@@ -982,7 +984,7 @@
             GetExtensionAccess(extension.get(), test_example_com));
 
   // Flip back to using default policy for this extension.
-  extension->permissions_data()->SetUsesDefaultHostRestrictions();
+  extension->permissions_data()->SetUsesDefaultHostRestrictions(context_id);
 
   // Make sure the default policy has the same effect as before we defined an
   // individual policy. Access to test.example.com should be allowed, but all
@@ -1003,6 +1005,8 @@
       URLPattern(URLPattern::SCHEME_ALL, "https://*.example.com/*"));
   default_allowed.AddPattern(
       URLPattern(URLPattern::SCHEME_ALL, "https://test.example.com/*"));
+  // give the profile some consistent id
+  int context_id = 7;
 
   // In all of these tests, test.example.com should have scripting allowed, with
   // all other subdomains and example.com itself blocked.
@@ -1010,8 +1014,9 @@
   // Test <all_urls> for regular extensions.
   scoped_refptr<Extension> extension =
       LoadManifestStrict("script_and_capture", "extension_regular_all.json");
-  extension->permissions_data()->SetDefaultPolicyHostRestrictions(
-      default_blocked, default_allowed);
+  extension->permissions_data()->SetUsesDefaultHostRestrictions(context_id);
+  PermissionsData::SetDefaultPolicyHostRestrictions(context_id, default_blocked,
+                                                    default_allowed);
 
   EXPECT_EQ(ALLOWED_SCRIPT_AND_CAPTURE,
             GetExtensionAccess(extension.get(), http_url));
@@ -1053,8 +1058,9 @@
   // Test * for scheme, which implies just the http/https schemes.
   extension =
       LoadManifestStrict("script_and_capture", "extension_wildcard.json");
-  extension->permissions_data()->SetDefaultPolicyHostRestrictions(
-      default_blocked, default_allowed);
+  extension->permissions_data()->SetUsesDefaultHostRestrictions(context_id);
+  PermissionsData::SetDefaultPolicyHostRestrictions(context_id, default_blocked,
+                                                    default_allowed);
   EXPECT_EQ(ALLOWED_SCRIPT_ONLY, GetExtensionAccess(extension.get(), http_url));
   EXPECT_EQ(DISALLOWED, GetExtensionAccess(extension.get(), example_com));
   EXPECT_EQ(ALLOWED_SCRIPT_ONLY,
@@ -1070,15 +1076,16 @@
   extension =
       LoadManifest("script_and_capture", "extension_wildcard_settings.json");
   extension->permissions_data()->SetDefaultPolicyHostRestrictions(
-      default_blocked, default_allowed);
+      0, default_blocked, default_allowed);
   EXPECT_EQ(DISALLOWED, GetExtensionAccess(extension.get(), settings_url));
 
   // Component extensions with <all_urls> should get everything regardless of
   // policy, except for chrome scheme URLs.
   extension = LoadManifest("script_and_capture", "extension_component_all.json",
                            Manifest::COMPONENT, Extension::NO_FLAGS);
-  extension->permissions_data()->SetDefaultPolicyHostRestrictions(
-      default_blocked, default_allowed);
+  extension->permissions_data()->SetUsesDefaultHostRestrictions(context_id);
+  PermissionsData::SetDefaultPolicyHostRestrictions(0, default_blocked,
+                                                    default_allowed);
   EXPECT_EQ(ALLOWED_SCRIPT_AND_CAPTURE,
             GetExtensionAccess(extension.get(), http_url));
   EXPECT_EQ(ALLOWED_SCRIPT_AND_CAPTURE,
@@ -1342,9 +1349,14 @@
     URLPattern chrome_settings(URLPattern::SCHEME_ALL,
                                chrome::kChromeUISettingsURL);
     chrome_settings.SetPath("*");
+    int context_id = 7;
     URLPatternSet blocked_patterns({example_com, chrome_settings});
-    PermissionsData::SetDefaultPolicyHostRestrictions(blocked_patterns,
-                                                      URLPatternSet());
+    all_urls().permissions_data()->SetUsesDefaultHostRestrictions(context_id);
+    PermissionsData::SetDefaultPolicyHostRestrictions(
+        context_id, blocked_patterns, URLPatternSet());
+    active_tab().permissions_data()->SetUsesDefaultHostRestrictions(context_id);
+    page_capture().permissions_data()->SetUsesDefaultHostRestrictions(
+        context_id);
   }
 
   const GURL test_urls[] = {
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index ac2275e..0a0ba8fd 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -959,6 +959,11 @@
 // user. Controlled by PerAppTimeLimits policy.
 const char kPerAppTimeLimitsPolicy[] = "child_user.per_app_time_limits.policy";
 
+// Dictionary pref containing the whitelisted urls, schemes and applications
+// that would not be blocked by per app time limits.
+const char kPerAppTimeLimitsWhitelistPolicy[] =
+    "child_user.per_app_time_limits.whitelist";
+
 // List of preconfigured network file shares.
 const char kNetworkFileSharesPreconfiguredShares[] =
     "network_file_shares.preconfigured_shares";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 703ca3db..18de222e 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -312,6 +312,7 @@
 extern const char kMostRecentlyUsedNetworkFileShareURL[];
 extern const char kParentAccessCodeConfig[];
 extern const char kPerAppTimeLimitsPolicy[];
+extern const char kPerAppTimeLimitsWhitelistPolicy[];
 extern const char kDeviceWallpaperImageFilePath[];
 extern const char kKerberosRememberPasswordEnabled[];
 extern const char kKerberosAddAccountsAllowed[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index b31cf64..00dd673 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2427,7 +2427,7 @@
         "../browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc",
         "../browser/ui/views/frame/system_menu_model_builder_browsertest_chromeos.cc",
         "../browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc",
-        "../browser/ui/views/plugin_vm/plugin_vm_launcher_view_browsertest.cc",
+        "../browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc",
         "../browser/ui/views/web_apps/web_app_ash_interactive_ui_test.cc",
         "../browser/ui/web_applications/web_app_guest_session_browsertest_chromeos.cc",
         "../browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc",
diff --git a/chrome/test/base/in_process_browser_test_browsertest.cc b/chrome/test/base/in_process_browser_test_browsertest.cc
index a7abb83..c8f712a 100644
--- a/chrome/test/base/in_process_browser_test_browsertest.cc
+++ b/chrome/test/base/in_process_browser_test_browsertest.cc
@@ -21,7 +21,6 @@
 #include "content/public/common/content_switches.h"
 #include "net/base/filename_util.h"
 #include "net/base/net_errors.h"
-#include "net/dns/public/resolve_error_info.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -45,8 +44,7 @@
   explicit LoadFailObserver(content::WebContents* contents)
       : content::WebContentsObserver(contents),
         failed_load_(false),
-        error_code_(net::OK),
-        resolve_error_info_(net::ResolveErrorInfo(net::OK)) {}
+        error_code_(net::OK) { }
 
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override {
@@ -55,21 +53,16 @@
 
     failed_load_ = true;
     error_code_ = navigation_handle->GetNetErrorCode();
-    resolve_error_info_ = navigation_handle->GetResolveErrorInfo();
     validated_url_ = navigation_handle->GetURL();
   }
 
   bool failed_load() const { return failed_load_; }
   net::Error error_code() const { return error_code_; }
-  net::ResolveErrorInfo resolve_error_info() const {
-    return resolve_error_info_;
-  }
   const GURL& validated_url() const { return validated_url_; }
 
  private:
   bool failed_load_;
   net::Error error_code_;
-  net::ResolveErrorInfo resolve_error_info_;
   GURL validated_url_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFailObserver);
@@ -91,8 +84,7 @@
     LoadFailObserver observer(contents);
     ui_test_utils::NavigateToURL(browser(), url);
     EXPECT_TRUE(observer.failed_load());
-    EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, observer.error_code());
-    EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, observer.resolve_error_info().error);
+    EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, observer.error_code());
     EXPECT_EQ(url, observer.validated_url());
   }
 }
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index c8863f16..e9709996 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -95,6 +95,8 @@
     'ChromeDownloadDirTest.testFileDownloadAfterTabHeadless',
     'ChromeDownloadDirTest.testFileDownloadWithClickHeadless',
     'ChromeDownloadDirTest.testFileDownloadWithGetHeadless',
+    # https://bugs.chromium.org/p/chromium/issues/detail?id=946023
+    'ChromeDriverTest.testWindowFullScreen',
 ]
 _OS_SPECIFIC_FILTER['linux'] = [
     # https://crbug.com/1036055
diff --git a/chrome/test/data/android/feed/feed_world.gcl.textproto b/chrome/test/data/android/feed/feed_world.gcl.textproto
index e186b489..c0fac14 100644
--- a/chrome/test/data/android/feed/feed_world.gcl.textproto
+++ b/chrome/test/data/android/feed/feed_world.gcl.textproto
@@ -1,5 +1,5 @@
 initial_response {
-  [search.now.wire.feed.FeedResponse.feed_response] {
+  [components.feed.core.proto.wire.FeedResponse.feed_response] {
   data_operation {
     operation: CLEAR_ALL
   }
@@ -412,7 +412,7 @@
     }
     feature {
       renderable_unit: STREAM
-      [search.now.ui.stream.Stream.stream_extension] {
+      [components.feed.core.proto.ui.stream.Stream.stream_extension] {
       }
     }
   }
@@ -432,7 +432,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.24852186
@@ -447,7 +447,7 @@
           publisher: "CNN.com"
           favicon_url: "https://www.google.com/s2/favicons?domain=www.cnn.com&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -502,9 +502,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -516,16 +516,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -538,7 +538,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -551,7 +551,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -564,7 +564,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -574,7 +574,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -608,7 +608,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -653,7 +653,7 @@
                   binding_values {
                     binding_id: "store-video-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://amp.cnn.com/cnn/2019/10/28/tech/airpods-pro/index.html"
                         offline_binding {
                           visibility: GONE
@@ -694,7 +694,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://amp.cnn.com/cnn/2019/10/28/tech/airpods-pro/index.html"
                         offline_binding {
                           visibility: VISIBLE
@@ -738,10 +738,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -791,7 +791,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -811,7 +811,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.23091772
@@ -825,7 +825,7 @@
           publisher: "NPR"
           favicon_url: "https://www.google.com/s2/favicons?domain=www.npr.org&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -877,9 +877,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -891,16 +891,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -913,7 +913,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -926,7 +926,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -939,7 +939,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -949,7 +949,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -983,7 +983,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -1036,7 +1036,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://www.npr.org/2019/10/28/774010986/secret-air-force-space-plane-lands-after-more-than-2-years-in-orbit"
                         offline_binding {
                           visibility: VISIBLE
@@ -1080,10 +1080,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -1133,7 +1133,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -1153,7 +1153,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.23098952
@@ -1167,7 +1167,7 @@
           publisher: "Yahoo"
           favicon_url: "https://www.google.com/s2/favicons?domain=www.yahoo.com&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -1219,9 +1219,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -1233,16 +1233,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -1255,7 +1255,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -1268,7 +1268,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -1281,7 +1281,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -1291,7 +1291,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -1325,7 +1325,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -1378,7 +1378,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://www.yahoo.com/entertainment/t-says-iggy-azalea-started-182613881.html"
                         offline_binding {
                           visibility: VISIBLE
@@ -1422,10 +1422,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -1475,7 +1475,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -1495,7 +1495,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.22743402
@@ -1510,7 +1510,7 @@
           publisher: "ZDNet"
           favicon_url: "https://www.google.com/s2/favicons?domain=www.zdnet.com&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -1565,9 +1565,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -1579,16 +1579,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -1601,7 +1601,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -1614,7 +1614,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -1627,7 +1627,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -1637,7 +1637,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -1671,7 +1671,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -1724,7 +1724,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://www.zdnet.com/google-amp/article/undoing-my-1000-mistake-why-im-returning-the-pixel-4xl-to-google/"
                         offline_binding {
                           visibility: VISIBLE
@@ -1768,10 +1768,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -1821,7 +1821,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -1841,7 +1841,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.22031662
@@ -1856,7 +1856,7 @@
           publisher: "The Verge"
           favicon_url: "https://www.google.com/s2/favicons?domain=www.theverge.com&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -1911,9 +1911,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -1925,16 +1925,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -1947,7 +1947,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -1960,7 +1960,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -1973,7 +1973,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -1983,7 +1983,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -2017,7 +2017,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -2070,7 +2070,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://www.theverge.com/platform/amp/2019/10/29/20937559/amazon-echo-buds-wireless-earbuds-review-features-bose-noise-reduction-price"
                         offline_binding {
                           visibility: VISIBLE
@@ -2114,10 +2114,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -2167,7 +2167,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -2187,7 +2187,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.21396348
@@ -2202,7 +2202,7 @@
           publisher: "Ars Technica"
           favicon_url: "https://www.google.com/s2/favicons?domain=arstechnica.com&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -2257,9 +2257,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -2271,16 +2271,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -2293,7 +2293,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -2306,7 +2306,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -2319,7 +2319,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -2329,7 +2329,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -2363,7 +2363,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -2416,7 +2416,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://arstechnica.com/information-technology/2019/10/att-loses-another-1-3-million-tv-customers-as-directv-freefall-continues/?amp=1"
                         offline_binding {
                           visibility: VISIBLE
@@ -2460,10 +2460,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -2513,7 +2513,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -2533,7 +2533,7 @@
         table: "FEATURE"
       }
       renderable_unit: CONTENT
-      [search.now.ui.stream.Content.content_extension] {
+      [components.feed.core.proto.ui.stream.Content.content_extension] {
         type: PIET
         basic_logging_metadata {
           score: 0.22791371
@@ -2548,7 +2548,7 @@
           publisher: "CNN.com"
           favicon_url: "https://www.google.com/s2/favicons?domain=www.cnn.com&sz=48"
         }
-        [search.now.ui.stream.PietContent.piet_content_extension] {
+        [components.feed.core.proto.ui.stream.PietContent.piet_content_extension] {
           piet_shared_states {
             content_domain: "piet-shared-state"
             id: 1243929906
@@ -2603,9 +2603,9 @@
                     binding_id: "story-click-action"
                     actions {
                       on_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_URL
                                 open_url_data {
@@ -2617,16 +2617,16 @@
                         }
                       }
                       on_long_click_action {
-                        [search.now.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
+                        [components.feed.core.proto.ui.action.PietFeedActionPayload.piet_feed_action_payload_extension] {
                           feed_action_payload {
-                            [search.now.ui.action.FeedAction.feed_action_extension] {
+                            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                               metadata {
                                 type: OPEN_CONTEXT_MENU
                                 open_context_menu_data {
                                   context_menu_data {
                                     label: "Open in new tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_TAB
                                           open_url_data {
@@ -2639,7 +2639,7 @@
                                   context_menu_data {
                                     label: "Open in incognito tab"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_INCOGNITO
                                           open_url_data {
@@ -2652,7 +2652,7 @@
                                   context_menu_data {
                                     label: "Open in other window"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: OPEN_URL_NEW_WINDOW
                                           open_url_data {
@@ -2665,7 +2665,7 @@
                                   context_menu_data {
                                     label: "Download link"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DOWNLOAD
                                         }
@@ -2675,7 +2675,7 @@
                                   context_menu_data {
                                     label: "Remove"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: DISMISS_LOCAL
                                           dismiss_data {
@@ -2709,7 +2709,7 @@
                                   context_menu_data {
                                     label: "Learn more"
                                     feed_action_payload {
-                                      [search.now.ui.action.FeedAction.feed_action_extension] {
+                                      [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
                                         metadata {
                                           type: LEARN_MORE
                                         }
@@ -2754,7 +2754,7 @@
                   binding_values {
                     binding_id: "store-video-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://amp.cnn.com/cnn/2019/10/29/politics/vindman-testimony-whistleblower-identity/index.html"
                         offline_binding {
                           visibility: GONE
@@ -2795,7 +2795,7 @@
                   binding_values {
                     binding_id: "story-offline-badge-visible"
                     host_binding_data {
-                      [search.now.ui.stream.OfflineExtension.offline_extension] {
+                      [components.feed.core.proto.ui.stream.OfflineExtension.offline_extension] {
                         url: "https://amp.cnn.com/cnn/2019/10/29/politics/vindman-testimony-whistleblower-identity/index.html"
                         offline_binding {
                           visibility: VISIBLE
@@ -2839,10 +2839,10 @@
         table: "FEATURE"
       }
       renderable_unit: CARD
-      [search.now.ui.stream.Card.card_extension] {
-        [search.now.ui.stream.SwipeActionExtension.swipe_action_extension] {
+      [components.feed.core.proto.ui.stream.Card.card_extension] {
+        [components.feed.core.proto.ui.stream.SwipeActionExtension.swipe_action_extension] {
           swipe_action {
-            [search.now.ui.action.FeedAction.feed_action_extension] {
+            [components.feed.core.proto.ui.action.FeedAction.feed_action_extension] {
               metadata {
                 type: DISMISS_LOCAL
                 dismiss_data {
@@ -2892,7 +2892,7 @@
         table: "FEATURE"
       }
       renderable_unit: CLUSTER
-      [search.now.ui.stream.Cluster.cluster_extension] {
+      [components.feed.core.proto.ui.stream.Cluster.cluster_extension] {
       }
     }
   }
@@ -2912,7 +2912,7 @@
         table: "FEATURE"
       }
       renderable_unit: TOKEN
-      [search.now.wire.feed.Token.token_extension] {
+      [components.feed.core.proto.wire.Token.token_extension] {
         next_page_token: "dummy_token"
       }
     }
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index d34a60b1..6057650 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -6106,6 +6106,33 @@
     ]
   },
 
+  "PerAppTimeLimitsWhitelist" : {
+    "os": ["chromeos"],
+    "test_policy": { "PerAppTimeLimitsWhitelist": {
+      "scheme_list": [
+        "chrome",
+        "files"
+      ],
+      "domain_list": [
+        "support.google.com",
+        "policies.google.com"
+      ],
+      "app_list": [
+       {
+        "app_id": "pjkljhegncpnkpknbcohdijeoejaedia",
+        "app_type": "EXTENSION"
+       },
+       {
+         "app_id": "iniodglblcgmngkgdipeiclkdjjpnlbn",
+         "app_type": "BUILT-IN"
+       }
+      ]
+    }
+    },
+    "can_be_recommended": false,
+    "pref_mappings": [{"pref": "child_user.per_app_time_limits.whitelist"}]
+  },
+
   "----- Chrome Frame policies -------------------------------------------": {},
 
   "ChromeFrameRendererSettings": {},
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
index d94e868..b28039f 100644
--- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
+++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -172,8 +172,8 @@
   this.runMochaTest(extension_item_tests.TestNames.SourceIndicator);
 });
 
-TEST_F('CrExtensionsItemsTest', 'EnableToggle', function() {
-  this.runMochaTest(extension_item_tests.TestNames.EnableToggle);
+TEST_F('CrExtensionsItemsTest', 'EnableToggleAndButton', function() {
+  this.runMochaTest(extension_item_tests.TestNames.EnableToggleAndButton);
 });
 
 TEST_F('CrExtensionsItemsTest', 'RemoveButton', function() {
diff --git a/chrome/test/data/webui/extensions/detail_view_test.js b/chrome/test/data/webui/extensions/detail_view_test.js
index c83bdb57..6eb2c310 100644
--- a/chrome/test/data/webui/extensions/detail_view_test.js
+++ b/chrome/test/data/webui/extensions/detail_view_test.js
@@ -64,6 +64,7 @@
     expectTrue(testIsVisible('#closeButton'));
     expectTrue(testIsVisible('#icon'));
     expectTrue(testIsVisible('#enableToggle'));
+    expectFalse(testIsVisible('#enableButton'));
     expectFalse(testIsVisible('#extensions-options'));
     expectTrue(
         item.$.description.textContent.indexOf('This is an extension') !== -1);
@@ -169,6 +170,7 @@
     expectTrue(testIsVisible('.warning-icon'));
 
     expectTrue(testIsVisible('#enableToggle'));
+    expectFalse(testIsVisible('#enableButton'));
     expectFalse(testIsVisible('#terminated-reload-button'));
 
     // This section tests that the enable toggle is visible but disabled when
@@ -178,19 +180,22 @@
     flush();
     expectTrue(testIsVisible('#enableToggle'));
     expectTrue(item.$$('#enableToggle').disabled);
+    expectFalse(testIsVisible('#enableButton'));
     item.set('data.disableReasons.blockedByPolicy', false);
     flush();
 
     item.set('data.disableReasons.custodianApprovalRequired', true);
     flush();
-    expectTrue(testIsVisible('#enableToggle'));
-    expectTrue(item.$$('#enableToggle').disabled);
+    expectFalse(testIsVisible('#enableToggle'));
+    expectTrue(testIsVisible('#enableButton'));
+    expectFalse(item.$$('#enableButton').disabled);
     item.set('data.disableReasons.custodianApprovalRequired', false);
     flush();
 
     item.set('data.state', chrome.developerPrivate.ExtensionState.TERMINATED);
     flush();
     expectFalse(testIsVisible('#enableToggle'));
+    expectFalse(testIsVisible('#enableButton'));
     expectTrue(testIsVisible('#terminated-reload-button'));
 
     // Ensure that the runtime warning reload button is not visible if there
@@ -366,6 +371,9 @@
     testWarningVisible('#suspicious-warning', false);
     testWarningVisible('#blacklisted-warning', false);
     testWarningVisible('#update-required-warning', false);
+    const testIsVisible = isVisible.bind(null, item);
+    expectTrue(testIsVisible('#enableToggle'));
+    expectFalse(testIsVisible('#enableButton'));
 
     item.set('data.disableReasons.suspiciousInstall', true);
     flush();
diff --git a/chrome/test/data/webui/extensions/item_test.js b/chrome/test/data/webui/extensions/item_test.js
index 9f15c0f..c1f2d0bd 100644
--- a/chrome/test/data/webui/extensions/item_test.js
+++ b/chrome/test/data/webui/extensions/item_test.js
@@ -85,7 +85,8 @@
   FailedReloadFiresLoadError: 'failed reload fires load error',
   Warnings: 'warnings',
   SourceIndicator: 'source indicator',
-  EnableToggle: 'toggle is disabled when necessary',
+  EnableToggleAndButton:
+      'Enable toggle and button are disabled/hidden when necessary',
   RemoveButton: 'remove button hidden when necessary',
   HtmlInName: 'html in extension name',
 };
@@ -149,6 +150,8 @@
             'data.state', chrome.developerPrivate.ExtensionState.TERMINATED);
         flush();
         testVisible(item, '#dev-reload-button', false);
+        testVisible(item, '#enableToggle', false);
+        testVisible(item, '#enableButton', false);
       });
 
   /** Tests that the delegate methods are correctly called. */
@@ -160,6 +163,8 @@
     mockDelegate.testClickingCalls(
         item.$['enableToggle'], 'setItemEnabled', [item.data.id, false]);
     mockDelegate.testClickingCalls(
+        item.$['enableButton'], 'setItemEnabled', [item.data.id, true]);
+    mockDelegate.testClickingCalls(
         item.$$('#inspect-views a[is="action-link"]'), 'inspectItemView',
         [item.data.id, item.data.views[0]]);
 
@@ -184,6 +189,8 @@
     flush();
     mockDelegate.testClickingCalls(
         item.$$('#repair-button'), 'repairItem', [item.data.id]);
+    testVisible(item, '#enableToggle', false);
+    testVisible(item, '#enableButton', false);
 
     item.set('data.state', chrome.developerPrivate.ExtensionState.TERMINATED);
     flush();
@@ -320,35 +327,42 @@
     expectFalse(isVisible(item, '#source-indicator'));
   });
 
-  test(assert(extension_item_tests.TestNames.EnableToggle), function() {
-    expectFalse(item.$['enableToggle'].disabled);
+  test(
+      assert(extension_item_tests.TestNames.EnableToggleAndButton), function() {
+        expectFalse(item.$['enableToggle'].disabled);
+        expectFalse(item.$['enableButton'].disabled);
 
-    // Test case where user does not have permission.
-    item.set('data.userMayModify', false);
-    flush();
-    expectTrue(item.$['enableToggle'].disabled);
+        // Test case where user does not have permission.
+        item.set('data.userMayModify', false);
+        flush();
+        expectTrue(item.$['enableToggle'].disabled);
+        expectFalse(item.$['enableButton'].disabled);
 
-    // Test case of a blacklisted extension.
-    item.set('data.userMayModify', true);
-    item.set('data.state', 'BLACKLISTED');
-    flush();
-    expectTrue(item.$['enableToggle'].disabled);
+        // Test case of a blacklisted extension.
+        item.set('data.userMayModify', true);
+        item.set('data.state', 'BLACKLISTED');
+        flush();
+        expectTrue(item.$['enableToggle'].disabled);
 
-    // This section tests that the enable toggle is visible but disabled
-    // when disableReasons.blockedByPolicy is true. This test prevents a
-    // regression to crbug/1003014.
-    item.set('data.disableReasons.blockedByPolicy', true);
-    flush();
-    testVisible(item, '#enableToggle', true);
-    expectTrue(item.$['enableToggle'].disabled);
-    item.set('data.disableReasons.blockedByPolicy', false);
-    flush();
+        // This section tests that the enable toggle is visible but disabled
+        // when disableReasons.blockedByPolicy is true. This test prevents a
+        // regression to crbug/1003014.
+        item.set('data.disableReasons.blockedByPolicy', true);
+        flush();
+        testVisible(item, '#enableToggle', true);
+        expectTrue(item.$['enableToggle'].disabled);
+        testVisible(item, '#enableButton', false);
+        item.set('data.disableReasons.blockedByPolicy', false);
+        flush();
 
-    item.set('data.disableReasons.custodianApprovalRequired', true);
-    flush();
-    testVisible(item, '#enableToggle', true);
-    expectTrue(item.$$('#enableToggle').disabled);
-  });
+        item.set('data.disableReasons.custodianApprovalRequired', true);
+        flush();
+        testVisible(item, '#enableToggle', false);
+        testVisible(item, '#enableButton', true);
+        expectFalse(item.$$('#enableButton').disabled);
+        item.set('data.disableReasons.custodianApprovalRequired', false);
+        flush();
+      });
 
   test(assert(extension_item_tests.TestNames.RemoveButton), function() {
     expectFalse(item.$['remove-button'].hidden);
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 241d605f..dee696e 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1293,7 +1293,7 @@
     'test_util.js',
     '../test_util.js',
     'test_site_settings_prefs_browser_proxy.js',
-    'chromeos/test_multidevice_browser_proxy.js',
+    'test_android_info_browser_proxy.js',
     'site_list_tests.js',
   ]),
 };
diff --git a/chrome/test/data/webui/settings/site_list_tests.js b/chrome/test/data/webui/settings/site_list_tests.js
index f82296181..5bbedf61 100644
--- a/chrome/test/data/webui/settings/site_list_tests.js
+++ b/chrome/test/data/webui/settings/site_list_tests.js
@@ -253,7 +253,7 @@
               settings.ContentSettingsTypes.NOTIFICATIONS, [
                 // android sms setting.
                 test_util.createRawSiteException(
-                    multidevice.TEST_ANDROID_SMS_ORIGIN),
+                    android_info.TEST_ANDROID_SMS_ORIGIN),
                 // Non android sms setting that should be handled as usual.
                 test_util.createRawSiteException('http://bar.com')
               ])]);
@@ -280,10 +280,10 @@
   let browserProxy = null;
 
   /**
-   * Mock MultiDeviceBrowserProxy to use during test.
-   * @type {TestMultideviceBrowserProxy}
+   * Mock AndroidInfoBrowserProxy to use during test.
+   * @type {TestAndroidInfoBrowserProxy}
    */
-  let multiDeviceBrowserProxy = null;
+  let androidInfoBrowserProxy = null;
 
   suiteSetup(function() {
     CrSettingsPrefs.setInitialized();
@@ -305,8 +305,8 @@
     document.body.appendChild(testElement);
 
     if (cr.isChromeOS) {
-      multiDeviceBrowserProxy = new multidevice.TestMultideviceBrowserProxy();
-      settings.MultiDeviceBrowserProxyImpl.instance_ = multiDeviceBrowserProxy;
+      androidInfoBrowserProxy = new android_info.TestAndroidInfoBrowserProxy();
+      settings.AndroidInfoBrowserProxyImpl.instance_ = androidInfoBrowserProxy;
     }
   });
 
@@ -412,7 +412,7 @@
           settings.ContentSettingsTypes.NOTIFICATIONS,
           settings.ContentSetting.ALLOW, prefsAndroidSms);
       assertEquals(
-          0, multiDeviceBrowserProxy.getCallCount('getAndroidSmsInfo'));
+          0, androidInfoBrowserProxy.getCallCount('getAndroidSmsInfo'));
 
       loadTimeData.overrideValues({multideviceAllowedByPolicy: true});
       setUpCategory(
@@ -420,9 +420,9 @@
           settings.ContentSetting.ALLOW, prefsAndroidSms);
       // Assert 2 calls since the observer observes 2 properties.
       assertEquals(
-          2, multiDeviceBrowserProxy.getCallCount('getAndroidSmsInfo'));
+          2, androidInfoBrowserProxy.getCallCount('getAndroidSmsInfo'));
 
-      return multiDeviceBrowserProxy.whenCalled('getAndroidSmsInfo')
+      return androidInfoBrowserProxy.whenCalled('getAndroidSmsInfo')
           .then(() => browserProxy.whenCalled('getExceptionList'))
           .then((contentType) => {
             assertEquals(
@@ -440,8 +440,6 @@
             assertEquals(undefined, testElement.sites[1].showAndroidSmsNote);
 
             browserProxy.resetResolver('getExceptionList');
-            multiDeviceBrowserProxy.setFeatureEnabledState(
-                settings.MultiDeviceFeature.MESSAGES, false);
             return browserProxy.whenCalled('getExceptionList');
           })
           .then((contentType) => {
diff --git a/chrome/test/data/webui/settings/test_android_info_browser_proxy.js b/chrome/test/data/webui/settings/test_android_info_browser_proxy.js
new file mode 100644
index 0000000..415d541c
--- /dev/null
+++ b/chrome/test/data/webui/settings/test_android_info_browser_proxy.js
@@ -0,0 +1,31 @@
+// Copyright 2019 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.
+
+cr.define('android_info', function() {
+  /**
+   * Test value for messages for web permissions origin.
+   */
+  const TEST_ANDROID_SMS_ORIGIN = 'http://foo.com';
+
+  /** @implements {settings.AndroidInfoBrowserProxy} */
+  class TestAndroidInfoBrowserProxy extends TestBrowserProxy {
+    constructor() {
+      super([
+        'getAndroidSmsInfo',
+      ]);
+      this.androidSmsInfo = {origin: TEST_ANDROID_SMS_ORIGIN, enabled: true};
+    }
+
+    /** @override */
+    getAndroidSmsInfo() {
+      this.methodCalled('getAndroidSmsInfo');
+      return Promise.resolve(this.androidSmsInfo);
+    }
+  }
+
+  return {
+    TestAndroidInfoBrowserProxy: TestAndroidInfoBrowserProxy,
+    TEST_ANDROID_SMS_ORIGIN: TEST_ANDROID_SMS_ORIGIN,
+  };
+});
diff --git a/chromeos/components/media_app_ui/resources/js/receiver.js b/chromeos/components/media_app_ui/resources/js/receiver.js
index abb43d5a..437f7534 100644
--- a/chromeos/components/media_app_ui/resources/js/receiver.js
+++ b/chromeos/components/media_app_ui/resources/js/receiver.js
@@ -50,4 +50,12 @@
   }
 }
 
+// Attempting to execute chooseFileSystemEntries is guaranteed to result in a
+// SecurityError due to the fact that we are running in a unprivileged iframe.
+// Note, we can not do window.chooseFileSystemEntries due to the fact that
+// closure does not yet know that 'chooseFileSystemEntries' is on the window.
+// TODO(crbug/1040328): Remove this when we have a polyfill that allows us to
+// talk to the privileged frame.
+window['chooseFileSystemEntries'] = null;
+
 window.addEventListener('message', receiveMessage, false);
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb
index 64cd2c5..f089e3e 100644
--- a/chromeos/strings/chromeos_strings_es-419.xtb
+++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -10,7 +10,7 @@
 <translation id="2083960536266308407">No se encontró nada en la pantalla</translation>
 <translation id="2338501278241028356">Activar Bluetooth para buscar los dispositivos cercanos</translation>
 <translation id="2805756323405976993">Aplicaciones</translation>
-<translation id="2872961005593481000">Cerrar</translation>
+<translation id="2872961005593481000">Apagar</translation>
 <translation id="3008341117444806826">ACTUALIZAR</translation>
 <translation id="3838338534323494292">Nueva contraseña</translation>
 <translation id="4003259559679196451"><ph name="ENROLLMENT_DOMAIN" /> administra este dispositivo y tiene acceso a toda la actividad del usuario, incluso las páginas web que visitó, su correo electrónico y sus contraseñas.</translation>
diff --git a/components/cronet/stale_host_resolver.cc b/components/cronet/stale_host_resolver.cc
index 58fb0c8..5097042 100644
--- a/components/cronet/stale_host_resolver.cc
+++ b/components/cronet/stale_host_resolver.cc
@@ -216,10 +216,8 @@
   cache_parameters.source = net::HostResolverSource::LOCAL_ONLY;
   cache_request_ = resolver_->inner_resolver_->CreateRequest(
       host_, network_isolation_key_, net_log_, cache_parameters);
-  int error =
+  cache_error_ =
       cache_request_->Start(base::BindOnce([](int error) { NOTREACHED(); }));
-  DCHECK_NE(net::ERR_IO_PENDING, error);
-  cache_error_ = cache_request_->GetResolveErrorInfo().error;
   DCHECK_NE(net::ERR_IO_PENDING, cache_error_);
   // If it's a fresh cache hit (or literal), return it synchronously.
   if (cache_error_ != net::ERR_DNS_CACHE_MISS &&
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc
index b1250db1..8e97f5e 100644
--- a/components/exo/client_controlled_shell_surface.cc
+++ b/components/exo/client_controlled_shell_surface.cc
@@ -35,6 +35,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
+#include "components/exo/shell_surface_util.h"
 #include "components/exo/surface.h"
 #include "components/exo/wm_helper.h"
 #include "ui/aura/client/aura_constants.h"
@@ -578,6 +579,19 @@
       widget_->GetNativeWindow(), orientation_lock);
 }
 
+void ClientControlledShellSurface::SetClientAccessibilityId(
+    int32_t accessibility_id) {
+  if (accessibility_id >= 0)
+    client_accessibility_id_ = accessibility_id;
+  else
+    client_accessibility_id_.reset();
+
+  if (widget_ && widget_->GetNativeWindow()) {
+    SetShellClientAccessibilityId(widget_->GetNativeWindow(),
+                                  client_accessibility_id_);
+  }
+}
+
 void ClientControlledShellSurface::OnBoundsChangeEvent(
     ash::WindowStateType current_state,
     ash::WindowStateType requested_state,
@@ -938,6 +952,9 @@
     accelerator_target_->RegisterAccelerator(
         ui::Accelerator(entry.keycode, entry.modifiers), entry.action);
   }
+
+  auto* window = widget_->GetNativeWindow();
+  SetShellClientAccessibilityId(window, client_accessibility_id_);
 }
 
 float ClientControlledShellSurface::GetScale() const {
diff --git a/components/exo/client_controlled_shell_surface.h b/components/exo/client_controlled_shell_surface.h
index 1d8abb7..8104a05 100644
--- a/components/exo/client_controlled_shell_surface.h
+++ b/components/exo/client_controlled_shell_surface.h
@@ -209,6 +209,10 @@
   // //ash/display/screen_orientation_controller.h.
   void SetOrientationLock(ash::OrientationLockType orientation_lock);
 
+  // Set the accessibility ID provided by client for the surface. If
+  // |accessibility_id| is negative value, it will unset the ID.
+  void SetClientAccessibilityId(int32_t accessibility_id);
+
   // Overridden from SurfaceDelegate:
   bool IsInputEnabled(Surface* surface) const override;
   void OnSetFrame(SurfaceFrameType type) override;
@@ -357,6 +361,9 @@
   // Client controlled specific accelerator target.
   std::unique_ptr<ClientControlledAcceleratorTarget> accelerator_target_;
 
+  // Accessibility ID provided by client.
+  base::Optional<int32_t> client_accessibility_id_;
+
   DISALLOW_COPY_AND_ASSIGN(ClientControlledShellSurface);
 };
 
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index f765114..d37076c 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -35,6 +35,7 @@
 #include "components/exo/buffer.h"
 #include "components/exo/display.h"
 #include "components/exo/pointer.h"
+#include "components/exo/shell_surface_util.h"
 #include "components/exo/sub_surface.h"
 #include "components/exo/surface.h"
 #include "components/exo/test/exo_test_base.h"
@@ -1848,6 +1849,28 @@
   EnableTabletMode(false);
 }
 
+TEST_F(ClientControlledShellSurfaceTest, SetClientAccessibilityId) {
+  gfx::Size buffer_size(64, 64);
+  std::unique_ptr<Buffer> buffer(
+      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
+  std::unique_ptr<Surface> surface(new Surface);
+  auto shell_surface =
+      exo_test_helper()->CreateClientControlledShellSurface(surface.get());
+
+  EXPECT_FALSE(shell_surface->GetWidget());
+  shell_surface->SetClientAccessibilityId(0);
+
+  surface->Attach(buffer.get());
+  surface->Commit();
+  aura::Window* window = shell_surface->GetWidget()->GetNativeWindow();
+  EXPECT_EQ(0, *GetShellClientAccessibilityId(window));
+  shell_surface->SetClientAccessibilityId(1);
+  EXPECT_EQ(1, *GetShellClientAccessibilityId(window));
+
+  shell_surface->SetClientAccessibilityId(-1);
+  EXPECT_FALSE(GetShellClientAccessibilityId(window));
+}
+
 // Tests adjust bounds locally should also request remote client bounds update.
 TEST_F(ClientControlledShellSurfaceTest, AdjustBoundsLocally) {
   UpdateDisplay("800x600");
diff --git a/components/exo/shell_surface_util.cc b/components/exo/shell_surface_util.cc
index a05cbe3..2099ae6 100644
--- a/components/exo/shell_surface_util.cc
+++ b/components/exo/shell_surface_util.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "ash/public/cpp/app_types.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "components/exo/permission.h"
 #include "components/exo/shell_surface_base.h"
@@ -33,6 +34,9 @@
 // Startup Id set by the client.
 DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::string, kStartupIdKey, nullptr)
 
+// Accessibility Id set by the client.
+DEFINE_UI_CLASS_PROPERTY_KEY(int32_t, kClientAccessibilityIdKey, -1)
+
 // Permission object allowing this window to activate itself.
 DEFINE_UI_CLASS_PROPERTY_KEY(exo::Permission*, kPermissionKey, nullptr)
 
@@ -71,6 +75,26 @@
   return window->GetProperty(kStartupIdKey);
 }
 
+void SetShellClientAccessibilityId(aura::Window* window,
+                                   const base::Optional<int32_t>& id) {
+  TRACE_EVENT1("exo", "SetClientAccessibilityId", "id",
+               id ? base::NumberToString(*id) : "null");
+
+  if (id)
+    window->SetProperty(kClientAccessibilityIdKey, *id);
+  else
+    window->ClearProperty(kClientAccessibilityIdKey);
+}
+
+const base::Optional<int32_t> GetShellClientAccessibilityId(
+    aura::Window* window) {
+  auto id = window->GetProperty(kClientAccessibilityIdKey);
+  if (id < 0)
+    return base::nullopt;
+  else
+    return id;
+}
+
 void SetShellMainSurface(aura::Window* window, Surface* surface) {
   window->SetProperty(kMainSurfaceKey, surface);
 }
diff --git a/components/exo/shell_surface_util.h b/components/exo/shell_surface_util.h
index 0579d52d..ac0a7f9 100644
--- a/components/exo/shell_surface_util.h
+++ b/components/exo/shell_surface_util.h
@@ -43,6 +43,13 @@
                        const base::Optional<std::string>& id);
 const std::string* GetShellStartupId(aura::Window* window);
 
+// Sets the client accessibility ID for the window. The accessibility ID
+// identifies the accessibility tree provided by client.
+void SetShellClientAccessibilityId(aura::Window* window,
+                                   const base::Optional<int32_t>& id);
+const base::Optional<int32_t> GetShellClientAccessibilityId(
+    aura::Window* window);
+
 // Sets the main surface for the window.
 void SetShellMainSurface(aura::Window* window, Surface* surface);
 
diff --git a/components/exo/wayland/zcr_remote_shell.cc b/components/exo/wayland/zcr_remote_shell.cc
index fd860f9..7e9041ce 100644
--- a/components/exo/wayland/zcr_remote_shell.cc
+++ b/components/exo/wayland/zcr_remote_shell.cc
@@ -547,7 +547,8 @@
 void remote_surface_set_accessibility_id(wl_client* client,
                                          wl_resource* resource,
                                          int32_t accessibility_id) {
-  NOTIMPLEMENTED();
+  GetUserDataAs<ClientControlledShellSurface>(resource)
+      ->SetClientAccessibilityId(accessibility_id);
 }
 
 void remote_surface_set_pip_original_window(wl_client* client,
diff --git a/components/gcm_driver/OWNERS b/components/gcm_driver/OWNERS
index df2a091..84a79f5 100644
--- a/components/gcm_driver/OWNERS
+++ b/components/gcm_driver/OWNERS
@@ -2,7 +2,6 @@
 fgorski@chromium.org
 jianli@chromium.org
 peter@chromium.org
-zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
 # TEAM: platform-capabilities@chromium.org
diff --git a/components/network_time/OWNERS b/components/network_time/OWNERS
index 5f6b84aa..8acddd3 100644
--- a/components/network_time/OWNERS
+++ b/components/network_time/OWNERS
@@ -1,4 +1,4 @@
-zea@chromium.org
 estark@chromium.org
+carlosil@chromium.org
 
 # COMPONENT: UI>Browser>Interstitials
diff --git a/components/ntp_snippets/OWNERS b/components/ntp_snippets/OWNERS
index bedbf1a..bf4d34ef 100644
--- a/components/ntp_snippets/OWNERS
+++ b/components/ntp_snippets/OWNERS
@@ -3,7 +3,6 @@
 harringtond@chromium.org
 carlosk@chromium.org
 dimich@chromium.org
-zea@chromium.org
 
 # For ios:
 noyau@chromium.org
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 8a5ac6b..2c5cf0d 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -1074,6 +1074,7 @@
       'policies': [
         'ParentAccessCodeConfig',
         'PerAppTimeLimits',
+        'PerAppTimeLimitsWhitelist',
         'UsageTimeLimit',
       ],
     },
@@ -19344,6 +19345,77 @@
        If the policy is set to false, autoupgrades will be disabled for audio and video, and no warning will be shown for images.
        This policy does not affect other types of mixed content other than audio, video, and images.''',
     },
+    {
+      'name': 'PerAppTimeLimitsWhitelist',
+      'owners': ['yilkal@chromium.org', 'cros-families-eng@google.com'],
+      'id': 658,
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': True
+      },
+      'type':  'dict',
+      'schema': {
+        'type': 'object',
+        'properties': {
+          'url_list': {
+            'type': 'array',
+            'items': {
+              'type': 'string',
+            }
+          },
+          'app_list': {
+            'type': 'array',
+            'items': {
+              'type': 'object',
+              'properties': {
+                'app_id': {
+                  'type': 'string'
+                },
+                'app_type': {
+                  'type': 'string',
+                  'enum': [
+                    'ARC',
+                    'BUILT-IN',
+                    'EXTENSION',
+                    'WEB',
+                    'CROSTINI'
+                  ],
+                }
+              },
+            }
+          }
+        }
+      },
+      'example_value': {
+        'url_list': [
+          "chrome://*",
+          "file://*",
+          "https://www.support.google.com",
+          "https://www.policies.google.com"
+        ],
+        'app_list': [
+          {
+            'app_id': 'pjkljhegncpnkpknbcohdijeoejaedia',
+            'app_type': 'EXTENSION'
+          },
+          {
+            'app_id': 'iniodglblcgmngkgdipeiclkdjjpnlbn',
+            'app_type': 'BUILT-IN'
+          }
+        ]
+      },
+      'caption': '''Per-App Time Limits Whitelist''',
+      'tags': [],
+      'supported_on': ['chrome_os: 80-'],
+      'desc': '''This policy specifies which applications and URLs should be whitelisted for per-app usage restrictions.
+        The configured whitelist are applied to the apps installed on <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> for the given user with per-app time limits.
+        The configured whitelist can only be applied to child user accounts and take effect when <ph name="PER_APP_TIME_LIMITS_POLICY_NAME">PerAppTimeLimits</ph> policy is set.
+        The configured whitelist are applied to applications and URLs so that they will not be blocked by per-app time limits.
+        Accessing whitelisted URLs will not count towards the chrome time limit.
+        Add url regular expressions to |url_list| to whitelist urls that match any of the regular expressions in the list.
+        Add an application with its |app_id| and |app_type| to |app_list| to whitelist the application.
+       '''
+    },
   ],
 
   'messages': {
@@ -20171,6 +20243,6 @@
   ],
   'placeholders': [],
   'deleted_policy_ids': [412, 546, 562, 569, 578],
-  'highest_id_currently_used': 657,
+  'highest_id_currently_used': 658,
   'highest_atomic_group_id_currently_used': 38
 }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 1cd945e..71f49f2 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -247,13 +247,6 @@
           Sie bietet einen Ersatzwert für die spezifischeren Richtlinien "<ph name="IDLE_ACTION_AC_POLICY_NAME" />" und "<ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />". Wenn die Richtlinie konfiguriert ist, wird ihr Wert verwendet, sofern die jeweilige spezifischere Richtlinie nicht festgelegt ist.
 
           Ist sie nicht konfiguriert, bleibt das Verhalten der spezifischeren Richtlinien unverändert.</translation>
-<translation id="1383493480903114193">Mit diese Richtlinie wird erzwungen, dass der Netzwerkcode im Browserprozess ausgeführt wird.
-
-      Sie ist standardmäßig deaktiviert. Ist die Richtlinie aktiviert, so ist der Nutzer nicht mehr vor den Sicherheitsproblemen geschützt, sobald der Netzwerkprozess in einer Sandbox ausgeführt wird.
-
-      Diese Richtlinie soll Unternehmen ermöglichen, zu Drittanbietersoftware zu migrieren, die nicht auf Hooking von Netzwerk-APIs angewiesen sind. Proxyserver werden anstelle von LSPs und Win32 API-Patching empfohlen.
-
-      Wenn die Richtlinie nicht konfiguriert ist, kann der Netzwerkcode – je nach Abhängigkeit der Feldtests des NetworkService-Tests – außerhalb des Browserprozesses ausgeführt werden.</translation>
 <translation id="1384459581748403878">Referenz: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Update-Status des Betriebssystems melden</translation>
 <translation id="1393485621820363363">Aktivierte, an Geräte gebundene Unternehmensdrucker</translation>
@@ -4156,21 +4149,6 @@
       Wenn diese Richtlinie festgelegt ist, kann der Elternzugriffscode auf dem Gerät des Kindes überprüft werden.
       Ist die Richtlinie nicht festgelegt, kann der Elternzugriffscode auf dem Gerät des Kindes nicht überprüft werden.</translation>
 <translation id="7625444193696794922">Gibt den Release-Kanal an, an den dieses Gerät gebunden werden soll.</translation>
-<translation id="7625498350540361483">
-      Wenn diese Richtlinie auf "true" gesetzt ist, darf <ph name="PRODUCT_NAME" /> WebRTC-Ereignisprotokolle aus Google-Diensten, wie z. B. Hangouts Meet, speichern und die Protokolle bei Google hochladen.
-
-      Ist die Richtlinie auf "false" gesetzt, darf <ph name="PRODUCT_NAME" /> solche Protokolle weder speichern noch hochladen.
-
-      Ist diese Richtlinie nicht konfiguriert (bis einschließlich M76), darf <ph name="PRODUCT_NAME" /> solche Protokolle weder speichern noch hochladen.
-
-      Ist diese Richtlinie nicht konfiguriert (ab M77), darf <ph name="PRODUCT_NAME" /> solche Protokolle standardmäßig speichern oder hochladen, wenn das Browserprofil als verwaltet gilt, d. h. das Profil erhält Richtlinien aus der Cloud- oder Maschinenebene und ist kein untergeordnetes, flüchtiges, Anmelde- oder Inkognitoprofil.
-
-      Diese Protokolle enthalten Diagnoseinformationen, die für die Fehlerbehebung bei Audio- oder Videoanrufen in Chrome hilfreich sein können. Dazu zählen die Uhrzeit und die Größe gesendeter und empfangener RTP-Pakete, Feedback zur Auslastung des Netzwerks und Metadaten zur Länge und Qualität von Audio- und Videoframes. Die Protokolle enthalten keine Audio- oder Videoinhalte aus dem Anruf.
-
-      Das Erfassen dieser Daten kann nur von den Google-Webdiensten ausgelöst werden, etwa von Google Hangouts oder Hangouts Meet.
-
-      Google kann diese Protokolle anhand einer Sitzungs-ID mit anderen Protokollen verknüpfen, die vom Google-Dienst selbst erstellt wurden. Dies dient dazu, Fehler leichter zu beheben.
-      </translation>
 <translation id="7632724434767231364">Name der GSSAPI-Bibliothek</translation>
 <translation id="7635471475589566552">Konfiguriert das App-Gebietsschema in <ph name="PRODUCT_NAME" /> und verhindert, dass Nutzer das Gebietsschema ändern. Wenn Sie diese Einstellung aktivieren, verwendet <ph name="PRODUCT_NAME" /> das angegebene Gebietsschema. Wird das konfigurierte Gebietsschema nicht unterstützt, kommt stattdessen "en-US" zum Einsatz. Ist diese Einstellung deaktiviert oder nicht konfiguriert, verwendet <ph name="PRODUCT_NAME" /> das vom Nutzer angegebene bevorzugte Gebietsschema (sofern konfiguriert), das Gebietsschema des Systems oder das Ersatz-Gebietsschema "en-US".</translation>
 <translation id="7643883929273267746">Sichtbarkeit von Konten in <ph name="PRODUCT_NAME" /> einschränken</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 97076740..d02936e 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -250,13 +250,6 @@
           Esta política proporciona un valor de resguardo para las políticas <ph name="IDLE_ACTION_AC_POLICY_NAME" /> y <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> más específicas. Si se configura esta política, se utilizará su valor cuando no se establece la política más específica correspondiente.
 
           Si no se configura, no se verá afectado el comportamiento de las políticas más específicas.</translation>
-<translation id="1383493480903114193">Esta política fuerza la ejecución del código de red en el proceso de navegación.
-
-      Está inhabilitada de forma predeterminada, pero, si se habilita, deja a los usuarios desprotegidos frente a problemas de seguridad una vez que el proceso de red se encuentre en la zona de pruebas.
-
-      Esta política permite que las empresas migren a software de terceros sin necesidad de modificar las API de red. Se recomiendan los servidores Proxy antes que los LSP y la aplicación de parches de API Win32.
-
-      Si no se establece esta política, es posible que el código de red se agote en el proceso del navegador en función de las pruebas de campo del experimento NetworkService.</translation>
 <translation id="1384459581748403878">Referencia: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Informa el estado de la actualización del SO</translation>
 <translation id="1393485621820363363">Impresoras empresariales habilitadas asociadas a dispositivos</translation>
@@ -4161,21 +4154,6 @@
       Si se establece esta política, el código de acceso superior podrá verificarse en el dispositivo del usuario menor de edad.
       Si no se establece, no es posible verificar el código en esos dispositivos.</translation>
 <translation id="7625444193696794922">Especifica el canal de publicaciones al que debe conectarse este dispositivo.</translation>
-<translation id="7625498350540361483">
-      Si se establece la política como verdadera, <ph name="PRODUCT_NAME" /> podrá recopilar registros de acontecimientos de WebRTC de los servicios de Google (p. ej., Google Meet) y subir esos registros a Google.
-
-      Si se establece como falsa, <ph name="PRODUCT_NAME" /> no podrá recopilar ni subir esos registros.
-
-      Si no se establece, hasta la versión M76 inclusive, <ph name="PRODUCT_NAME" /> no podrá recopilar ni subir esos registros.
-
-      En cambio, a partir de la versión M77, <ph name="PRODUCT_NAME" /> podrá recopilarlos y subirlos de forma predeterminada si se considera que el perfil del navegador está administrado, es decir, si el perfil recibe políticas de nube o de la máquina y no se trata de un perfil de incógnito, de acceso, efímero o de un niño.
-
-      Estos registros contienen información de diagnóstico que resulta útil para depurar problemas con llamadas de video o audio en Chrome, como el momento en que se enviaron y recibieron paquetes RTP (y el tamaño de estos), comentarios sobre la congestión en la red y metadatos sobre el tiempo y la calidad de los cuadros de video y audio. Estos registros no tienen contenido de audio ni video de la llamada.
-
-      Esta recopilación de datos por parte de Chrome solo se puede activar a través de los servicios web de Google, como Google Hangouts o Google Meet.
-
-      Con el fin de simplificar la depuración, Google puede asociar estos registros, por medio de un ID de sesión, con otros registros recopilados por el servicio de Google en sí.
-      </translation>
 <translation id="7632724434767231364">Nombre de la biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Si se establece la configuración regional de la aplicación en <ph name="PRODUCT_NAME" />, los usuarios no podrán cambiarla. Si se habilita esta configuración, <ph name="PRODUCT_NAME" /> usará aquella que se especificó. Si la configuración regional no es compatible, se usará "en-US" en su lugar. Si esta opción se inhabilita o no se configura, <ph name="PRODUCT_NAME" /> usará la configuración regional preferida que haya especificado el usuario (si está configurada), la configuración regional del sistema o la configuración regional alternativa "en-US".</translation>
 <translation id="7643883929273267746">Restringir las cuentas visibles en <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index e8f64140..689bb26 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -248,13 +248,6 @@
           Esta política proporciona un valor alternativo a las políticas <ph name="IDLE_ACTION_AC_POLICY_NAME" /> y <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />, que son más específicas. Si se establece esta política, su valor se utiliza si no se establece la política más específica correspondiente.
 
           Si no se establece esta política, el comportamiento de las políticas más específicas no se verá afectado.</translation>
-<translation id="1383493480903114193">Esta política fuerza que el código de red se ejecute en el proceso del navegador.
-
-      Está inhabilitada de forma predeterminada, pero, si se habilita, deja a los usuarios desprotegidos frente a problemas de seguridad cuando el proceso de red se pone en zona de pruebas.
-
-      El objetivo de esta política es dar a las empresas la opción de migrar a software de terceros que no dependa de la modificación de las API de red. Es recomendable utilizar servidores proxy en lugar de LSP y parches de Win32 API.
-
-      Si no se define la política, el código de red puede agotarse en el proceso del navegador dependiendo de las pruebas de campo del experimento NetworkService.</translation>
 <translation id="1384459581748403878">Referencia: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Envía el estado de las actualizaciones del sistema operativo</translation>
 <translation id="1393485621820363363">Impresoras de dispositivos de empresa habilitadas</translation>
@@ -4278,21 +4271,6 @@
       Cuando esta política está activada, el código de acceso parental se puede verificar en el dispositivo del menor.
       Cuando esta política está desactivada, no se puede verificar el código de acceso parental en el dispositivo del menor.</translation>
 <translation id="7625444193696794922">Permite especificar el canal de versiones al que se vinculará este dispositivo.</translation>
-<translation id="7625498350540361483">
-      Si se asigna el valor True a esta política, <ph name="PRODUCT_NAME" /> podrá recoger registros de eventos WebRTC procedentes de los servicios de Google (p. ej., Google Meet) y enviarlos a Google.
-
-      Si se le asigna el valor False, <ph name="PRODUCT_NAME" /> no podrá recoger ni subir esos registros.
-
-      Si no se define esta política, en las versiones hasta la M76 (incluida), <ph name="PRODUCT_NAME" /> no podrá recoger ni subir esos registros.
-
-      Si no se define esta política, a partir de la versión M77, <ph name="PRODUCT_NAME" /> podrá recoger o subir estos registros de forma predeterminada si se considera que el perfil del navegador está administrado, es decir, si el perfil recibe políticas de nivel de ordenador o nube y no es un perfil infantil, efímero, de inicio de sesión o de incógnito.
-
-      Estos registros contienen información de diagnóstico que resulta útil para depurar errores de las llamadas de audio o las videollamadas en Chrome, como la hora y el tamaño de los paquetes RTP recibidos y enviados, comentarios sobre la congestión de la red y metadatos del tiempo y la calidad de los marcos de audio y vídeo. Estos registros no incluyen contenidos de audio ni de vídeo de las llamadas.
-
-      Esta recogida de datos solo la pueden activar los servicios web de Google, como Google Hangouts o Google Meet.
-
-      Google puede asociar estos registros, mediante un ID de sesión, a otros registros recogidos por el servicio de Google para facilitar la depuración.
-      </translation>
 <translation id="7632724434767231364">Nombre de biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Establece la configuración regional de la aplicación en <ph name="PRODUCT_NAME" /> e impide que los usuarios la modifiquen.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 03cf1d6f..f34e9fc 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -251,13 +251,6 @@
           Cette règle fournit une valeur de secours pour les règles <ph name="IDLE_ACTION_AC_POLICY_NAME" /> et <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />, qui sont plus spécifiques. Si cette règle est configurée, sa valeur est utilisée si la règle correspondante plus spécifique ne l'est pas.
 
           Si cette règle n'est pas configurée, le comportement des règles plus spécifiques n'est pas modifié.</translation>
-<translation id="1383493480903114193">Cette règle force le code réseau à s'exécuter dans le processus du navigateur.
-
-      Cette règle est désactivée par défaut. Si elle est activée, elle expose les utilisateurs à des problèmes de sécurité une fois le processus de mise en réseau envoyé dans le bac à sable.
-
-      Cette règle est destinée à donner aux entreprises la possibilité de migrer vers un logiciel tiers qui ne dépend pas de la connexion des API de mise en réseau. Il est recommandé d'utiliser des serveurs proxy plutôt que des LSP ou des correctifs de l'API Win32.
-
-      Si cette règle n'est pas définie, le code réseau peut ne pas suivre le processus du navigateur, en fonction des essais sur le terrain de l'expérience NetworkService.</translation>
 <translation id="1384459581748403878">Référence : <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Indiquer l'état de la mise à jour du système</translation>
 <translation id="1393485621820363363">Imprimantes d'appareils d'entreprise activées</translation>
@@ -4268,21 +4261,6 @@
       Lorsque cette règle est activée, le code d'accès parental peut être validé sur l'appareil d'un enfant.
       Lorsqu'elle est désactivée, il est impossible de valider ce code sur l'appareil d'un enfant.</translation>
 <translation id="7625444193696794922">Indique le canal de distribution sur lequel cet appareil devrait être verrouillé.</translation>
-<translation id="7625498350540361483">
-      Si la règle est définie sur "True", <ph name="PRODUCT_NAME" /> est autorisé à collecter auprès des services Google (Google Meet, par exemple) les journaux des événements WebRTC et à les importer sur Google.
-
-      Si la règle est définie sur "False", <ph name="PRODUCT_NAME" /> ne peut ni collecter ni importer ces journaux.
-
-      Si la règle n'est pas définie, jusqu'à M76 inclus, <ph name="PRODUCT_NAME" /> ne peut ni collecter ni importer ces journaux.
-
-      Si la règle n'est pas définie, à partir de M77, <ph name="PRODUCT_NAME" /> peut collecter ou importer ces journaux par défaut si le profil du navigateur est considéré comme géré, c'est-à-dire si le profil reçoit des règles au niveau du cloud ou de la machine, et n'est pas un profil d'enfant, un profil éphémère, un profil de connexion, ni un profil de navigation privée.
-
-      Ces journaux contiennent des informations de diagnostic utiles pour déboguer des problèmes liés aux appels audio ou vidéo dans Chrome, telles que l'horodatage et la taille des paquets RTP envoyés et reçus, des commentaires sur l'encombrement du réseau, ainsi que des métadonnées concernant l'horodatage et la qualité des trames vidéo et audio. Ces journaux n'incluent aucun contenu audio ni vidéo de l'appel.
-
-      Cette collecte de données par Chrome ne peut être déclenchée que par des services Web de Google, tels que Google Hangouts ou Google Meet.
-
-      Google peut associer ces journaux à d'autres journaux collectés par le service Google proprement dit à l'aide d'un ID de session dans le but de faciliter le débogage.
-      </translation>
 <translation id="7632724434767231364">Nom de la bibliothèque GSSAPI</translation>
 <translation id="7635471475589566552">Configure les paramètres régionaux de l'application dans <ph name="PRODUCT_NAME" /> et empêche les utilisateurs de modifier ces paramètres. 
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 28db9d8f..34aa638 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -237,13 +237,6 @@
           Kebijakan ini memberikan nilai fallback untuk <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> dan kebijakan <ph name="IDLE_ACTION_AC_POLICY_NAME" /> yang lebih spesifik. Jika kebijakan ini ditetapkan, nilainya akan digunakan jika masing-masing kebijakan yang lebih spesifik tidak ditetapkan.
 
           Jika kebijakan ini tidak ditetapkan, perilaku kebijakan yang lebih spesifik tetap tidak terpengaruh.</translation>
-<translation id="1383493480903114193">Kebijakan ini memaksa kode jaringan untuk dijalankan dalam proses browser.
-
-      Kebijakan ini dinonaktifkan secara default, dan jika diaktifkan, pengguna akan rentan terhadap masalah keamanan setelah proses jaringan masuk dalam sandbox.
-
-      Kebijakan ini dimaksudkan untuk memberi perusahaan kesempatan melakukan migrasi ke software pihak ke-3 yang tidak bergantung pada penarikan networking API. Sebaiknya gunakan server proxy daripada patch API Win32 dan LSP.
-
-      Jika kebijakan ini tidak disetel, kode jaringan mungkin dijalankan di luar proses browser yang bergantung pada uji coba kolom eksperimen NetworkService.</translation>
 <translation id="1384459581748403878">Referensi: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Melaporkan status update OS</translation>
 <translation id="1393485621820363363">Mengaktifkan printer perangkat perusahaan</translation>
@@ -4150,21 +4143,6 @@
       Jika kebijakan ini disetel, Kode Akses Orang Tua dapat diverifikasi di perangkat pengguna anak.
       Jika kebijakan ini tidak disetel, Kode Akses Orang Tua tidak dapat diverifikasi di perangkat pengguna anak.</translation>
 <translation id="7625444193696794922">Menentukan saluran rilis yang harus dikunci oleh perangkat ini.</translation>
-<translation id="7625498350540361483">
-      Jika kebijakan ditetapkan ke true, <ph name="PRODUCT_NAME" /> diizinkan untuk mengumpulkan log aktivitas WebRTC dari layanan Google (mis. Google Meet), dan mengupload log tersebut ke Google.
-
-      Jika kebijakan ditetapkan ke false, <ph name="PRODUCT_NAME" /> tidak dapat mengumpulkan atau mengupload log tersebut.
-
-      Jika kebijakan tidak ditetapkan, hingga dan termasuk M76, <ph name="PRODUCT_NAME" /> tidak dapat mengumpulkan atau mengupload log tersebut.
-
-      Jika kebijakan tidak ditetapkan, mulai M77, <ph name="PRODUCT_NAME" /> dapat mengumpulkan atau mengupload log tersebut secara default dengan syarat profil browser dianggap telah dikelola. Hal ini berarti, profil akan menerima kebijakan level cloud atau mesin, dan bukan merupakan profil turunan, profil singkat, profil login, atau profil samaran.
-
-      Log ini berisi informasi diagnostik yang berguna saat melakukan proses debug masalah pada panggilan audio atau video di Chrome, seperti waktu dan ukuran paket RTP yang dikirim dan diterima, masukan tentang kemacetan pada jaringan, dan metadata tentang waktu dan kualitas frame audio dan video. Log ini tidak berisi konten audio atau video dari panggilan.
-
-      Pengumpulan data yang dilakukan Chrome ini hanya dapat dipicu oleh layanan web Google, seperti Google Hangouts atau Google Meet.
-
-      Google dapat mengaitkan log ini dengan log lain, yang dikumpulkan oleh layanan Google sendiri, menggunakan ID sesi. Hal ini dimaksudkan untuk mempermudah proses debug.
-      </translation>
 <translation id="7632724434767231364">Nama pustaka GSSAPI</translation>
 <translation id="7635471475589566552">Mengonfigurasi lokal aplikasi di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah lokal tersebut. Jika Anda mengaktifkan setelan ini, <ph name="PRODUCT_NAME" /> akan menggunakan lokal yang ditentukan. Jika lokal terkonfigurasi tidak didukung, 'en-US' akan digunakan. Jika setelan ini dinonaktifkan atau tidak disetel, <ph name="PRODUCT_NAME" /> akan menggunakan lokal terpilih yang ditentukan pengguna (jika dikonfigurasi), lokal sistem, atau lokal pengganti 'en-US'.</translation>
 <translation id="7643883929273267746">Batasi akun yang terlihat di <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 48b5d4183..0377e260 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -237,13 +237,6 @@
           Questo criterio consente di fornire un valore di riserva per i criteri più specifici <ph name="IDLE_ACTION_AC_POLICY_NAME" /> e <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />. Se questo criterio viene impostato, il suo valore viene utilizzato se non viene impostato il rispettivo criterio più specifico.
 
           Se questo criterio non viene impostato, il comportamento dei criteri più specifici rimane invariato.</translation>
-<translation id="1383493480903114193">Questa norma forza l'esecuzione del codice di networking nel processo del browser.
-
-      Questa norma è disattivata per impostazione predefinita e, se attivata, rende gli utenti vulnerabili ai problemi di sicurezza dopo che il processo di networking viene limitato tramite sandbox.
-
-      Questa norma è pensata per offrire alle aziende la possibilità di migrare a software di terze parti che non dipendono dalla combinazione delle API di networking. I server proxy sono consigliati negli LSP e nelle patching API di Win32.
-
-      Se questa norma non è impostata, il codice di networking potrebbe essere eseguito al di fuori del processo di browser, a seconda delle prove sul campo dell'esperimento NetworkService.</translation>
 <translation id="1384459581748403878">Riferimento: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Indica lo stato di aggiornamento del sistema operativo</translation>
 <translation id="1393485621820363363">Stampanti aziendali associate ai dispositivi attive</translation>
@@ -4132,21 +4125,6 @@
       Quando questa norma è impostata, il codice di accesso genitori può essere verificato sul dispositivo dell'utente bambino o ragazzo.
       Quando questa norma non è impostata, non è possibile verificare il codice di accesso genitori sul dispositivo dell'utente bambino o ragazzo.</translation>
 <translation id="7625444193696794922">Consente di specificare il canale di rilascio su cui deve essere bloccato questo dispositivo.</translation>
-<translation id="7625498350540361483">
-      Se il criterio è impostato su true, <ph name="PRODUCT_NAME" /> può raccogliere log eventi WebRTC dai servizi Google (ad es., Google Meet) e caricare i log su Google.
-
-      Se il criterio è impostato su false, <ph name="PRODUCT_NAME" /> non può raccogliere né caricare questi log.
-
-      Se il criterio non è impostato, fino alla versione M76 inclusa, <ph name="PRODUCT_NAME" /> non può raccogliere né caricare questi log.
-
-      Se il criterio non è impostato, a partire dalla versione M77, <ph name="PRODUCT_NAME" /> può raccogliere o caricare questi log per impostazione predefinita se il profilo del browser è considerato gestito, ovvero se il profilo riceve criteri a livello di cloud o macchina e se non si tratta di un profilo secondario, temporaneo, di accesso o in incognito.
-
-      Questi log contengono informazioni diagnostiche utili per il debug dei problemi relativi a chiamate vocali o videochiamate in Chrome, ad esempio data/ora e dimensioni dei pacchetti RTP inviati e ricevuti, feedback sulla congestione della rete, nonché metadati su tempo e qualità dei frame audio e video. Questi log non contengono l'audio o i video delle chiamate.
-
-      Questa raccolta di dati da parte di Chrome può essere attivata soltanto dai servizi web di Google, ad esempio Google Hangouts o Google Meet.
-
-      Google potrebbe associare questi log tramite un ID sessione ad altri log raccolti dal servizio Google stesso al fine di facilitare il debug.
-      </translation>
 <translation id="7632724434767231364">Nome della libreria GSSAPI</translation>
 <translation id="7635471475589566552">Consente di configurare in <ph name="PRODUCT_NAME" /> le impostazioni della lingua e di impedirne la modifica agli utenti. Se attivi questa impostazione, <ph name="PRODUCT_NAME" /> utilizzerà le impostazioni della lingua specificate. Se la lingua configurata non è supportata, verrà utilizzata la lingua "en-US". Se questa impostazione viene disattivata o non viene impostata, <ph name="PRODUCT_NAME" /> utilizzerà la lingua preferita specificata dall'utente (se configurata), quella del sistema o la lingua di riserva "en-US".</translation>
 <translation id="7643883929273267746">Limita gli account visibili in <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index ba2ef54..b1c54b5 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -249,13 +249,6 @@
           このポリシーでは、より具体的な <ph name="IDLE_ACTION_AC_POLICY_NAME" /> ポリシーと <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> ポリシーの代替値を指定します。このポリシーを設定した場合は、より具体的な、対応するポリシーが設定されていなければ、このポリシーの値が使用されます。
 
           このポリシーを設定しない場合、より具体的なポリシーの動作に影響はありません。</translation>
-<translation id="1383493480903114193">このポリシーでは、ネットワーク用のコードがブラウザ プロセスで実行されます。
-
-      デフォルトでは、このポリシーは無効です。有効にした場合、ネットワーク プロセスがサンドボックス化されると、ユーザーはセキュリティの問題から保護されなくなります。
-
-      このポリシーは、企業がネットワーク API のフックに依存しないサードパーティのソフトウェアに移行できるようにすることを目的としたものです。LSP や Win32 API のパッチ適用にはプロキシ サーバーをおすすめします。
-
-      このポリシーが未設定の場合、ネットワーク用のコードは、NetworkService のフィールド テストに応じて、ブラウザ プロセス以外でも実行されます。</translation>
 <translation id="1384459581748403878">参考: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">OS の更新ステータスをレポートします</translation>
 <translation id="1393485621820363363">有効な企業デバイス プリンタ</translation>
@@ -4144,21 +4137,6 @@
 
 このポリシーは、アクセスコード設定を段階的に切り替える場合に使用することを想定しています。新しい設定は常に |future_config| に入力され、同時に既存の値は |current_config| に移動されます。|current_config| の以前の値は |old_configs| に移動され、切り替えが完了した後に削除されます。このポリシーは子どものユーザーにのみ適用されます。このポリシーが設定されている場合、子どものユーザーのデバイスで保護者のアクセスコードを確認できます。このポリシーが設定されていない場合、子どものユーザーのデバイスで保護者のアクセスコードを確認できません。</translation>
 <translation id="7625444193696794922">このデバイスを固定するリリース チャンネルを指定します。</translation>
-<translation id="7625498350540361483">
-      このポリシーが true に設定されている場合、<ph name="PRODUCT_NAME" /> に対して、Google サービス(Google Meet など)からの WebRTC イベントログの収集と、Google へのそれらのログのアップロードが許可されます。
-
-      このポリシーが false に設定されている場合、<ph name="PRODUCT_NAME" /> によるログの収集とアップロードは行われません。
-
-      ポリシーが未設定の場合、M76 以下では、<ph name="PRODUCT_NAME" /> によるログの収集とアップロードは行われません。
-
-      ポリシーが未設定のとき、M77 以降では、ブラウザ プロフィールが管理対象とみなされる場合(プロフィールでクラウドレベルかマシンレベルのポリシーを受信し、子プロフィール、一時プロフィール、ログイン プロフィール、シークレット プロフィールでない場合)には <ph name="PRODUCT_NAME" /> によるログの収集とアップロードがデフォルトで行われます。
-
-      これらのログには、送受信された RTP パケットの時間とサイズ、ネットワークの輻輳に関するフィードバック、音声および動画フレームの時間と品質に関するメタデータなど、Chrome での音声や動画の呼び出しに関する問題をデバッグする際に役立つ診断情報が含まれます。呼び出された音声や動画のコンテンツは含まれません。.
-
-      Chrome によるこのデータ収集は、Google のウェブサービス(Google ハングアウト、Google Meet など)からのみ行われます。
-
-      Google は、これらのログと、Google サービス自体により収集される他のログとをセッション ID を使って関連付けることがあります。この関連付けは、デバッグを容易にする目的で行われます。
-      </translation>
 <translation id="7632724434767231364">GSSAPI ライブラリ名</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> のアプリケーションの言語/地域を設定し、ユーザーが言語/地域を変更できないようにします。この設定を有効にすると、<ph name="PRODUCT_NAME" /> では指定された言語/地域が使用されます。設定した言語/地域がサポートされない場合、「en-US」が使用されます。この設定を無効にするか設定しないと、<ph name="PRODUCT_NAME" /> ではユーザー指定の適切な言語/地域(設定されている場合)、システムの言語/地域、代替の言語/地域「en-US」のいずれかが使用されます。</translation>
 <translation id="7643883929273267746"><ph name="PRODUCT_NAME" /> に表示されるアカウントを制限する</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index f72af5ad..02afde9f 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -251,13 +251,6 @@
           이 정책은 <ph name="IDLE_ACTION_AC_POLICY_NAME" /> 및 <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> 정책과 같이 더 구체적인 정책의 대체 값을 제공합니다. 더 구체적인 정책이 설정되지 않은 경우 이 정책에 설정된 대체 값이 사용됩니다.
 
           이 정책이 설정되지 않아도 더 구체적인 정책 사용에 영향을 주지 않습니다.</translation>
-<translation id="1383493480903114193">이 정책은 네트워킹 코드가 브라우저 프로세스에서 실행되도록 강제합니다.
-
-      이 정책은 기본적으로 사용 안함으로 설정되어 있으며 사용 설정할 경우 네트워킹 프로세스가 샌드박스 처리되었을 때 사용자가 보안 문제에 노출될 수 있습니다.
-
-      이 정책은 기업이 네트워킹 API 연결에 종속되지 않는 타사 소프트웨어로 이전할 기회를 제공하기 위해 만들어졌습니다. LSP 및 Win32 API 패칭보다 프록시 서버를 권장합니다.
-
-      이 정책이 설정되어 있지 않으면 NetworkService 실험의 실제 결과에 따라 네트워킹 코드가 브라우저 프로세스 외부에서 실행될 수 있습니다.</translation>
 <translation id="1384459581748403878">참고: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">OS 업데이트 상태 보고</translation>
 <translation id="1393485621820363363">사용 설정된 엔터프라이즈 기기 프린터</translation>
@@ -4277,21 +4270,6 @@
       이 정책이 설정되어 있으면 자녀 사용자의 기기에서 부모 액세스 코드를 확인할 수 있습니다.
       이 정책이 설정되어 있지 않으면 자녀 사용자의 기기에서 부모 액세스 코드를 확인할 수 없습니다.</translation>
 <translation id="7625444193696794922">기기에서 사용해야 할 특정 배포 채널을 지정합니다.</translation>
-<translation id="7625498350540361483">
-      이 정책이 True로 설정되면 <ph name="PRODUCT_NAME" />에서 Google 서비스(예: Google Meet)의 WebRTC 이벤트 로그를 수집하고 이러한 로그를 Google에 업로드할 수 있습니다.
-
-      정책이 False로 설정되면 <ph name="PRODUCT_NAME" />에서 이러한 로그를 수집하거나 업로드할 수 없습니다.
-
-      정책이 설정되지 않으면 최대 M76까지 <ph name="PRODUCT_NAME" />에서 이러한 로그를 수집하거나 업로드할 수 없습니다.
-
-      정책이 설정되지 않으면 M77부터 브라우저 프로필이 관리되는 것으로 간주되는 경우(즉, 프로필이 클라우드 또는 기기 수준 정책을 수신하며 하위, 임시, 로그인, 시크릿 프로필이 아닌 경우) <ph name="PRODUCT_NAME" />에서 이러한 로그를 기본적으로 수집하거나 업로드할 수 있습니다.
-
-      이러한 로그에는 주고받는 RTP 패킷의 시간 및 크기, 네트워크 혼잡에 관한 피드백, 오디오/동영상 프레임의 시간 및 품질에 관한 메타데이터 등 Chrome에서 음성/영상 통화 시 발생하는 문제를 디버깅하는 데 유용한 진단 정보가 포함됩니다. 이러한 로그에는 통화의 음성 또는 동영상 콘텐츠가 포함되어 있지 않습니다.
-
-      Chrome의 이러한 데이터 수집은 Google 행아웃 또는 Google Meet과 같은 Google 웹 서비스에 의해서만 실행됩니다.
-
-      Google에서는 세션 ID를 통해 이러한 로그를 Google 서비스 자체에서 수집한 다른 로그와 연결할 수 있습니다. 이는 디버깅을 더 쉽게 하기 위해서입니다.
-      </translation>
 <translation id="7632724434767231364">GSSAPI 라이브러리 이름</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" />에서 애플리케이션 언어를 설정하고 사용자가 언어를 변경할 수 없게 합니다.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index da33d7da..c106c5b 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -250,13 +250,6 @@
           Dit beleid levert een reservewaarde voor de specifiekere beleidsregels <ph name="IDLE_ACTION_AC_POLICY_NAME" /> en <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />. Als dit beleid is ingesteld, wordt de bijbehorende waarde gebruikt als het respectieve specifiekere beleid niet is ingesteld.
 
           Als dit beleid niet is ingesteld, heeft dit geen invloed op het gedrag van de specifiekere beleidsregels.</translation>
-<translation id="1383493480903114193">Met dit beleid wordt afgedwongen dat netwerkcode wordt uitgevoerd in het browserproces.
-
-      Dit beleid is standaard uitgeschakeld. Indien ingeschakeld, worden gebruikers blootgesteld aan beveiligingsproblemen wanneer het netwerkproces in een sandbox wordt uitgevoerd.
-
-      Dit beleid is bedoeld om bedrijven de kans te geven naar software van derden te migreren die niet afhankelijk is van hooking van de netwerk-API's. Proxyservers krijgen de voorkeur boven LSP's en Win32 API-patching.
-
-      Als dit beleid niet is ingesteld, kan de netwerkcode buiten het browserproces worden uitgevoerd, afhankelijk van praktijktests van het NetworkService-experiment.</translation>
 <translation id="1384459581748403878">Referentie: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">OS-updatestatus rapporten</translation>
 <translation id="1393485621820363363">Zakelijke apparaatprinters ingeschakeld</translation>
@@ -4240,21 +4233,6 @@
       Wanneer dit beleid is ingesteld, kan de toegangscode voor ouders worden geverifieerd op het apparaat van de gebruiker met een kinderaccount.
       Wanneer dit beleid niet is ingesteld, kan de toegangscode voor ouders niet worden geverifieerd op het apparaat van de gebruiker met een kinderaccount.</translation>
 <translation id="7625444193696794922">Hiermee wordt het releasekanaal gespecificeerd waarmee dit apparaat moet worden vergrendeld.</translation>
-<translation id="7625498350540361483">
-      Als het beleid is ingesteld op True, mag <ph name="PRODUCT_NAME" /> WebRTC-gebeurtenislogboeken verzamelen van Google-services (zoals Google Meet) en deze logboeken uploaden naar Google.
-
-      Als het beleid is ingesteld op False, mag <ph name="PRODUCT_NAME" /> deze logboeken niet verzamelen of uploaden.
-
-      Als het beleid niet is ingesteld, geldt voor versies tot en met M76 dat <ph name="PRODUCT_NAME" /> deze logboeken niet mag verzamelen of uploaden.
-
-      Als het beleid niet is ingesteld, geldt vanaf versie M77 dat <ph name="PRODUCT_NAME" /> deze logboeken standaard mag verzamelen of uploaden, afhankelijk van of het browserprofiel als beheerd wordt beschouwd (dat wil zeggen, het profiel ontvangt beleidsregels op cloud- of machineniveau) en geen onderliggend, tijdelijk, inlog- of incognitoprofiel is.
-
-      Deze logboeken bevatten diagnostische informatie die handig is voor het oplossen van problemen met audio- of videogesprekken in Chrome. Deze informatie betreft bijvoorbeeld het tijdstip en de grootte van verzonden en ontvangen RTP-pakketten, feedback over overbelasting van het netwerk en metadata over de duur en kwaliteit van audio- en videoframes. Deze logboeken bevatten geen audio of video van het gesprek.
-
-      Chrome verzamelt deze gegevens alleen als Chrome wordt getriggerd door webservices van Google, zoals Google Hangouts of Google Meet.
-
-      Google mag deze logboeken aan de hand van de sessie-ID koppelen aan andere logboeken die door de Google-service zelf zijn verzameld. Het doel hiervan is dat fouten makkelijker kunnen worden opgespoord.
-      </translation>
 <translation id="7632724434767231364">Naam van GSSAPI-bibliotheek</translation>
 <translation id="7635471475589566552">Hiermee wordt de landinstelling voor de applicatie geconfigureerd in <ph name="PRODUCT_NAME" /> en wordt voorkomen dat gebruikers de landinstelling kunnen wijzigen.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 1f420c57..6bee274 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -245,13 +245,6 @@
           Esta política fornece um valor substituto para as políticas <ph name="IDLE_ACTION_AC_POLICY_NAME" /> e <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> mais específicas. Se esta política for definida, os valores serão usados quando uma política respectiva mais específica não for usada.
 
           Se esta política não for definida, o comportamento das políticas mais específicas não será afetado.</translation>
-<translation id="1383493480903114193">Esta política força o código de rede a ser executado no processo do navegador.
-
-      A política está desativada por padrão e, se ativada, deixa usuários vulneráveis aos problemas de segurança quando o processo de rede estiver no sandbox.
-
-      Esta política tem como objetivo oferecer às empresas a oportunidade de migrar para um software de terceiros que não dependa de hook das APIs de rede. Recomendamos o uso de servidores proxy em vez da aplicação de patches de API Win32 e LSPs.
-
-      Se esta política não for definida, o código de rede pode sair do processo do navegador, dependendo de testes de campo do experimento do NetworkService.</translation>
 <translation id="1384459581748403878">Referência: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Informar o status de atualização do SO</translation>
 <translation id="1393485621820363363">Impressoras empresariais ativadas</translation>
@@ -4144,21 +4137,6 @@
       Quando esta política é definida, o código de acesso dos pais pode ser verificado no dispositivo da criança.
       Quando esta política não é definida, não é possível verificar o código de acesso dos pais no dispositivo da criança.</translation>
 <translation id="7625444193696794922">Especifica o canal de liberação ao qual este dispositivo deve ser vinculado.</translation>
-<translation id="7625498350540361483">
-      Se a política for definida como verdadeira, o <ph name="PRODUCT_NAME" /> poderá coletar logs de eventos WebRTC em serviços do Google (por exemplo, no Google Meet) e fazer upload desses registros no Google.
-
-      Se a política for definida como falsa, o <ph name="PRODUCT_NAME" /> não poderá coletar esses registros nem fazer upload deles.
-
-      Se a política não for definida, até a versão M76, o <ph name="PRODUCT_NAME" /> não poderá coletar esses registros nem fazer upload deles.
-
-      Se a política não for definida, a partir da versão M77, o <ph name="PRODUCT_NAME" /> poderá coletar esses registros e fazer upload deles por padrão se o perfil do navegador for considerado gerenciado, isto é, se o perfil receber políticas em nível de nuvem ou de máquina e não for um perfil filho, temporário, de login ou de navegação anônima.
-
-      Esses registros contêm informações de diagnóstico que são úteis durante a depuração de problemas com chamadas de áudio ou videochamadas no Chrome, como o horário e o tamanho de pacotes RTP enviados e recebidos, feedback sobre congestionamento na rede e metadados sobre o tempo e a qualidade de frames de áudio e vídeo. Esses registros não apresentam o conteúdo das chamadas de áudio ou videochamadas.
-
-      Essa coleta de dados feita pelo Chrome só pode ser acionada por serviços da Web do Google, como o Google Hangouts ou o Google Meet.
-
-      Por meio de um código de sessão, o Google pode associar esses registros a outros coletados pelo próprio serviço do Google. Isso é feito para facilitar a depuração.
-      </translation>
 <translation id="7632724434767231364">Nome da biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Configura a localidade do aplicativo em <ph name="PRODUCT_NAME" /> e impede que os usuários a alterem. Se ativar esta configuração, <ph name="PRODUCT_NAME" /> utilizará a localidade especificada. Se a localidade configurada não for compatível, "pt-BR" será utilizada. Se esta configuração for desativada ou não for configurada, <ph name="PRODUCT_NAME" /> utilizará a localidade preferida especificada pelo usuário (se configurada), a localidade do sistema ou a localidade padrão "pt-BR".</translation>
 <translation id="7643883929273267746">Contas restritas que estão visíveis no <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 34efab0..45fa64e 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -250,13 +250,6 @@
           Это правило предоставляет резервное значение для более подробных правил <ph name="IDLE_ACTION_AC_POLICY_NAME" /> и <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />. Когда правило настроено, его значение используется, только если не задано соответствующее более подробное правило.
 
           Если правило не настроено, оно никак не влияет на более подробные правила.</translation>
-<translation id="1383493480903114193">Это правило принудительно запускает сетевой код в процессе браузера.
-
-      По умолчанию правило отключено. Если оно включено, безопасность пользователей оказывается под угрозой, как только сетевой процесс запускается в изолированной среде.
-
-      Это правило предназначено для компаний, которые хотят перейти на стороннее программное обеспечение, не зависящее от перехвата функций сетевых API. Вместо того, чтобы исправлять API LSP и Win32, рекомендуется использовать прокси-серверы.
-
-      Если правило не настроено, сетевой код может запускаться вне процесса браузера в зависимости от испытаний в эксперименте сетевой службы.</translation>
 <translation id="1384459581748403878">Источник: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Сообщать о состоянии обновления ОС</translation>
 <translation id="1393485621820363363">Принтеры, доступные на устройствах компании</translation>
@@ -4174,21 +4167,6 @@
       Если оно задано, родительский код доступа можно подтвердить на устройстве ребенка.
       Если правило не настроено, подтвердить родительский код доступа на устройстве ребенка нельзя.</translation>
 <translation id="7625444193696794922">Задает канал выпуска, за которым должно быть закреплено устройство.</translation>
-<translation id="7625498350540361483">
-      Если для правила задано значение True, <ph name="PRODUCT_NAME" /> сможет собирать журналы событий WebRTC из сервисов Google (например, Google Meet) и загружать их в Google.
-
-      Если выбрано значение False, <ph name="PRODUCT_NAME" /> не сможет собирать и загружать эти журналы.
-
-      Если правило не настроено и используется версия не выше M76, <ph name="PRODUCT_NAME" /> не сможет собирать и загружать эти журналы.
-
-      Если правило не настроено и используется версия не ниже M77, <ph name="PRODUCT_NAME" /> по умолчанию сможет собирать и загружать эти журналы при условии, что профиль браузера считается управляемым (то есть получает правила на уровне облака или устройства и не является профилем ребенка, временным, регистрационным или анонимным профилем).
-
-      В журналах содержится такая информация, как размер отправленных и полученных пакетов RTP, время их отправки и получения, данные о перегрузке сети, а также метаданные о продолжительности и качестве аудио и видео. Такая информация полезна для отладки звонков и видеовстреч в Chrome. В журналах нет самого аудио- и видеоконтента.
-
-      Сбор данных могут запустить только веб-сервисы Google, например Hangouts и Meet.
-
-      Для упрощения отладки эти журналы могут быть связаны с журналами самих сервисов Google с помощью идентификатора сеанса.
-      </translation>
 <translation id="7632724434767231364">название библиотеки GSSAPI</translation>
 <translation id="7635471475589566552">Устанавливает региональные настройки приложения в <ph name="PRODUCT_NAME" /> и запрещает пользователям менять их. Если этот параметр включен, <ph name="PRODUCT_NAME" /> использует указанные региональные настройки. Если они не поддерживаются, используется вариант en-US. Если этот параметр отключен или не настроен, <ph name="PRODUCT_NAME" /> использует региональные настройки пользователя (если они выбраны), системные региональные настройки либо резервный вариант en-US.</translation>
 <translation id="7643883929273267746">Ограничить число аккаунтов, которые видны в <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index c768158..a504b5d 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -249,13 +249,6 @@
           นโยบายนี้จะให้ค่าสำรองสำหรับนโยบาย <ph name="IDLE_ACTION_AC_POLICY_NAME" /> และ <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> ที่เจาะจงยิ่งขึ้น หากตั้งค่านโยบายนี้ ระบบจะใช้ค่าของนโยบายในกรณีที่ไม่มีการตั้งค่านโยบายที่เจาะจงยิ่งขึ้นตามลำดับ
 
           เมื่อไม่ได้ตั้งค่านโยบายนี้ ลักษณะการทำงานของนโยบายที่เจาะจงยิ่งขึ้นจะไม่ได้รับผลกระทบ</translation>
-<translation id="1383493480903114193">นโยบายนี้บังคับให้เรียกใช้โค้ดเครือข่ายในกระบวนการของเบราว์เซอร์
-
-      ระบบจะปิดใช้นโยบายนี้ไว้โดยค่าเริ่มต้น และหากเปิดใช้ ผู้ใช้จะมีความเสี่ยงต่อปัญหาด้านความปลอดภัยเมื่อมีการแซนด์บ็อกซ์กระบวนการของเครือข่าย
-
-      นโยบายนี้มีไว้เพื่อเปิดโอกาสให้องค์กรย้ายข้อมูลไปยังซอฟต์แวร์ของบุคคลที่สามที่ไม่ได้ใช้การฮุก API เครือข่าย ขอแนะนำให้ใช้พร็อกซีเซิร์ฟเวอร์กับการแพตช์ LSPs และ Win32 API
-
-      หากไม่ได้ตั้งค่านโยบายนี้ โค้ดเครือข่ายอาจทำงานนอกกระบวนการของเบราว์เซอร์ โดยขึ้นอยู่กับการทดลองใช้งานจริงของการทดสอบ NetworkService</translation>
 <translation id="1384459581748403878">การอ้างอิง: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">รายงานสถานะการอัปเดตระบบปฏิบัติการ</translation>
 <translation id="1393485621820363363">เครื่องพิมพ์สำหรับอุปกรณ์ขององค์กรที่มีการเปิดใช้</translation>
@@ -4160,21 +4153,6 @@
       เมื่อตั้งค่านโยบายนี้ คุณจะยืนยันรหัสการเข้าถึงของผู้ปกครองในอุปกรณ์ของผู้ใช้ที่เป็นเด็กได้
       เมื่อไม่ได้ตั้งค่านโยบายนี้ คุณจะยืนยันรหัสการเข้าถึงของผู้ปกครองในอุปกรณ์ของผู้ใช้ที่เป็นเด็กไม่ได้</translation>
 <translation id="7625444193696794922">ระบุช่องทางแสดงผลที่ควรจะล็อกเข้ากับอุปกรณ์นี้</translation>
-<translation id="7625498350540361483">
-      หากตั้งค่านโยบายเป็น "จริง" <ph name="PRODUCT_NAME" /> จะได้รับอนุญาตให้รวบรวมบันทึกเหตุการณ์ WebRTC จากบริการของ Google (เช่น Google Meet) และอัปโหลดบันทึกไปยัง Google
-
-      หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า <ph name="PRODUCT_NAME" /> จะรวบรวมหรืออัปโหลดบันทึกเช่นนี้ไม่ได้
-
-      หากไม่ได้ตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> ตั้งแต่เวอร์ชัน M76 ลงมาจะรวบรวมหรืออัปโหลดบันทึกเช่นนี้ไม่ได้
-
-      หากไม่ได้ตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> ตั้งแต่เวอร์ชัน M77 ขึ้นไปจะรวบรวมหรืออัปโหลดบันทึกเช่นนี้ได้โดยค่าเริ่มต้นหากระบบเห็นว่าโปรไฟล์เบราว์เซอร์มีการจัดการ เช่น หากโปรไฟล์ได้รับนโยบายระดับแมชชีนหรือระดับคลาวด์ และไม่ได้เป็นโปรไฟล์ย่อย โปรไฟล์ชั่วคราว โปรไฟล์การเข้าสู่ระบบ หรือโปรไฟล์ไม่ระบุตัวตน
-
-      บันทึกเหล่านี้มีข้อมูลการวินิจฉัยซึ่งเป็นประโยชน์เมื่อแก้ไขข้อบกพร่องเกี่ยวกับการโทรด้วยเสียงหรือการโทรแบบวิดีโอคอลใน Chrome เช่น เวลาและขนาดของแพ็กเก็ต RTP ที่ส่งและได้รับ ผลป้อนกลับเกี่ยวกับความหนาแน่นในเครือข่าย ตลอดจนข้อมูลเมตาเกี่ยวกับระยะเวลาและคุณภาพของเสียงและเฟรมของวิดีโอ บันทึกเหล่านี้ไม่มีเนื้อหาเสียงหรือวิดีโอจากการโทร
-
-      มีเฉพาะบริการผ่านเว็บของ Google อย่างเช่น Google Hangouts หรือ Google Meet ที่จะเรียกใช้การรวบรวมข้อมูลนี้ได้
-
-      Google อาจเชื่อมโยงบันทึกเหล่านี้ (โดยใช้รหัสเซสชัน) กับบันทึกอื่นๆ ที่บริการของ Google รวบรวมไว้เอง โดยมีจุดประสงค์เพื่อให้แก้ไขข้อบกพร่องได้ง่ายขึ้น
-      </translation>
 <translation id="7632724434767231364">ชื่อไลบรารี GSSAPI</translation>
 <translation id="7635471475589566552">กำหนดค่าภาษาแอปพลิเคชันใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนภาษาดังกล่าว หากคุณเปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะใช้ภาษาที่ระบุ หากภาษาที่กำหนดค่าไว้ไม่ได้รับการรองรับ "en-US" จะถูกนำมาใช้แทน หากคุณปิดใช้งานหรือไม่ได้กำหนดค่าการตั้งค่านี้ <ph name="PRODUCT_NAME" /> อาจใช้ภาษาที่ต้องการตามที่ผู้ใช้ระบุ (หากกำหนดค่าไว้) ภาษาของระบบ หรือภาษาทางเลือก "en-US"</translation>
 <translation id="7643883929273267746">จำกัดบัญชีที่แสดงอยู่ใน <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 360fa387..a9483b0 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -239,13 +239,6 @@
           Bu politika daha özel <ph name="IDLE_ACTION_AC_POLICY_NAME" /> ve <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> politikaları için yedek değer sağlar. Bu politika ayarlanırsa ilgili daha özel politika ayarlanmadığında bunun değeri kullanılır.
 
           Bu politika ayarlanmadığında, daha özel politikaların çalışma biçimi aynı kalır.</translation>
-<translation id="1383493480903114193">Bu politika, ağ iletişimi kodunu tarayıcı işleminde çalışmaya zorlar.
-
-      Bu politika varsayılan olarak devre dışıdır ve etkinleştirilmesi halinde, ağ iletişimi işlemi korumalı alan içine alındıktan sonra kullanıcıları güvenlik sorunlarına karşı savunmasız hale getirir.
-
-      Bu politikanın amacı, işletmelere ağ iletişimi API'lerinin tutulmasına bel bağlamayan üçüncü taraf yazılımlarına geçme fırsatı vermektir. LSP'lerden ve Win32 API yamalarından ziyade proxy sunucuları önerilir.
-
-      Bu politika ayarlanmazsa, NetworkService deneyinin saha denemelerine bağlı olarak ağ iletişimi kodunun tarayıcı işlemi kalmayabilir.</translation>
 <translation id="1384459581748403878">Referans: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">OS güncelleme durumunu bildirir</translation>
 <translation id="1393485621820363363">Etkinleştirilmiş kurumsal cihaz yazıcıları</translation>
@@ -4248,21 +4241,6 @@
       Bu politika ayarlandığında, Ebeveyn Erişim Kodu çocuk kullanıcının cihazında doğrulanabilir.
       Bu politika ayarlanmadığında, Ebeveyn Erişim Kodu çocuk kullanıcının cihazında doğrulanamaz.</translation>
 <translation id="7625444193696794922">Bu cihazın kilitlenmesi gereken yayın kanalını belirtir.</translation>
-<translation id="7625498350540361483">
-      Politika true (doğru) değerine ayarlanırsa <ph name="PRODUCT_NAME" /> ürününün Google hizmetlerinden (ör. Google Meet) WebRTC olay günlüklerini toplamasına ve bu günlükleri Google’a yüklemesine izin verilir.
-
-      Politika false (yanlış) değerine ayarlanırsa <ph name="PRODUCT_NAME" /> bu tür günlükleri toplayamaz ve yükleyemez.
-
-      Bu politika ayarlanmadan bırakılırsa M76 ve önceki sürümlerde <ph name="PRODUCT_NAME" /> bu tür günlükleri toplayamaz ve yükleyemez.
-
-      Bu politika ayarlanmadan bırakılırsa M77 ve sonraki sürümlerde tarayıcı profilinin yönetildiği kabul edilirse (ör. profil bulut veya makine düzeyinde politikalar alıyorsa ve bir alt, geçici, giriş gerektiren veya gizli profil değilse) <ph name="PRODUCT_NAME" /> varsayılan olarak bu tür günlükleri toplayabilir ve yükleyebilir.
-
-      Bu günlükler, Chrome'daki sesli veya görüntülü çağrılarla ilgili, gönderilen ve alınan RTP paketlerinin saati ve boyutu, ağdaki tıkanmayla ilgili geri bildirim ve ses ile video karelerinin zamanı ve kalitesiyle ilgili meta veriler gibi sorunların ayıklanmasında yararlı olacak teşhis bilgilerini içerir. Bu günlükler çağrıya ait ses veya video içeriği barındırmaz.
-
-      Chrome'un gerçekleştirdiği bu veri toplama işlemi yalnızca Google Hangouts veya Google Meet gibi Google'ın bir web hizmeti tarafından tetiklenebilir.
-
-      Google bu günlükleri bir oturum kimliği aracılığıyla, Google hizmetinin kendisi tarafından toplanan diğer günlüklerle ilişkilendirebilir. Buradaki amaç hata ayıklamayı kolaylaştırmaktır.
-      </translation>
 <translation id="7632724434767231364">GSSAPI kitaplığı adı</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> içindeki uygulama yerel ayarını yapılandırır ve kullanıcıların yerel ayarı değiştirmelerini önler.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 8ace8e2d..8597051 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -254,13 +254,6 @@
           Це правило містить запасне значення для детальніших правил <ph name="IDLE_ACTION_AC_POLICY_NAME" /> та <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" />. Якщо це правило налаштовано, його значення використовується, коли не встановлено відповідне детальніше правило.
 
           Якщо це правило не налаштовано, дія детальніших правил не змінюється.</translation>
-<translation id="1383493480903114193">Це правило ініціює виконання коду мережі у веб-переглядачі.
-
-      Це правило вимкнено за умовчанням. Якщо його ввімкнути, у користувачів може виникнути проблема з безпекою, коли мережевий процес проходить через "пісочницю".
-
-      Це правило дає можливість підприємствам перейти на програмне забезпечення сторонніх розробників, що не залежить від обробки мережевих API. Замість LSP та виправлення Win32 API рекомендовано використовувати проксі-сервери.
-
-      Якщо це правило не налаштовано, мережевий код може виконуватися за межами процесу веб-переглядача залежно від тестування експерименту NetworkService.</translation>
 <translation id="1384459581748403878">Довідкові матеріали: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Повідомляти статус оновлення ОС</translation>
 <translation id="1393485621820363363">Увімкнені принтери пристроїв підприємства</translation>
@@ -4201,21 +4194,6 @@
       Коли його налаштовано, батьківський код доступу можна підтвердити на пристрої дитини.
       Коли правило не налаштовано, батьківський код доступу не можна підтвердити на пристрої дитини.</translation>
 <translation id="7625444193696794922">Указує версію випуску, з якою потрібно пов’язати цей пристрій.</translation>
-<translation id="7625498350540361483">
-      Якщо для цього правила вибрано значення true, <ph name="PRODUCT_NAME" /> може збирати журнали подій WebRTC із сервісів Google (як-от Google Meet) і завантажувати їх у Google.
-
-      Якщо для правила вибрано значення false, <ph name="PRODUCT_NAME" /> не може збирати й завантажувати такі журнали.
-
-      Якщо це правило не налаштовано у версії М76 і старіших, <ph name="PRODUCT_NAME" /> не може збирати й завантажувати такі журнали.
-
-      Якщо це правило не налаштовано у версії M77 і новіших, <ph name="PRODUCT_NAME" /> може збирати й завантажувати такі журнали за умовчанням, якщо профіль веб-переглядача вважається керованим, тобто якщо він отримує правила на рівні хмари або пристрою, а також не є дочірнім, тимчасовим, зареєстрованим або анонімним.
-
-      Ці журнали містять діагностичні дані, які допомагають вирішити проблеми з аудіо- й відеовикликами в Chrome, зокрема відомості про час надсилання й отримання пакетів RTP та їх розмір, відгуки про перевантаження мережі й метадані про тривалість і якість аудіофреймів та відеокадрів. Аудіо- й відеоконтент викликів не включається в ці журнали.
-
-      Збір цих даних у Chrome можуть активувати лише веб-сервіси Google, як-от Google Hangouts або Google Meet.
-
-      За допомогою ідентифікатора сеансу Google може пов'язувати ці журнали з іншими журналами, зібраними сервісом Google, щоб спростити налагодження.
-      </translation>
 <translation id="7632724434767231364">Назва бібліотеки GSSAPI</translation>
 <translation id="7635471475589566552">Установлює мовний код програми в <ph name="PRODUCT_NAME" /> і не дозволяє користувачам змінювати його. Якщо це налаштування ввімкнено, <ph name="PRODUCT_NAME" /> використовує вказаний мовний код. Якщо встановлений мовний код не підтримується, замість нього використовується "en-US". Якщо це налаштування вимкнено чи не встановлено, <ph name="PRODUCT_NAME" /> використовує вказаний користувачем мовний код (якщо налаштовано), мовний код системи або вихідний мовний код "en-US".</translation>
 <translation id="7643883929273267746">Обмежити видимість облікових записів у <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index c8b5dc3..c272e7b 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -252,13 +252,6 @@
           Chính sách này cung cấp giá trị dự phòng cho các chính sách <ph name="IDLE_ACTION_AC_POLICY_NAME" /> và <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> cụ thể hơn. Nếu bạn đặt chính sách này, thì giá trị của chính sách sẽ được sử dụng trong trường hợp bạn không đặt chính sách cụ thể hơn tương ứng.
 
           Khi bạn không đặt chính sách này, thì hoạt động của các chính sách cụ thể hơn sẽ không bị ảnh hưởng.</translation>
-<translation id="1383493480903114193">Chính sách này buộc mã nối mạng chạy trong quá trình chạy trình duyệt.
-
-      Chính sách này được tắt theo mặc định. Nếu bạn bật chính sách này, người dùng sẽ dễ gặp phải các sự cố bảo mật sau khi quá trình nối mạng được chạy trong hộp cát.
-
-      Chính sách này nhằm mang đến cho doanh nghiệp cơ hội di chuyển sang phần mềm của bên thứ 3 không phụ thuộc vào việc kết nối các API nối mạng. Thay vì vá API Win32 và LSP, bạn nên sử dụng máy chủ proxy.
-
-      Nếu bạn không đặt chính sách này, mã nối mạng có thể chạy ngoài quá trình chạy trình duyệt tùy theo kết quả thử nghiệm thực tế của thử nghiệm NetworkService.</translation>
 <translation id="1384459581748403878">Tham khảo: <ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">Báo cáo trạng thái cập nhật hệ điều hành</translation>
 <translation id="1393485621820363363">Đã bật máy in kết nối với thiết bị dành cho doanh nghiệp</translation>
@@ -4274,21 +4267,6 @@
       Khi bạn đặt chính sách này, Mã truy cập dành cho cha mẹ có thể được xác minh trên thiết bị của người dùng là trẻ em.
       Khi bạn không đặt chính sách này, Mã truy cập dành cho cha mẹ không xác minh được trên thiết bị của người dùng là trẻ em.</translation>
 <translation id="7625444193696794922">Chỉ định kênh phát hành mà thiết bị này phải bị khóa.</translation>
-<translation id="7625498350540361483">
-      Nếu bạn đặt chính sách này thành true, thì <ph name="PRODUCT_NAME" /> sẽ được phép thu thập nhật ký sự kiện WebRTC từ các dịch vụ của Google (ví dụ: Google Meet) và tải các nhật ký đó lên Google.
-
-      Nếu bạn đặt chính sách này thành false, thì <ph name="PRODUCT_NAME" /> sẽ không thể không thu thập cũng như tải các nhật ký đó lên.
-
-      Nếu bạn không đặt chính sách này, bao gồm cả phiên bản M76, <ph name="PRODUCT_NAME" /> sẽ không thể thu thập cũng như tải các nhật ký đó lên.
-
-      Nếu bạn không đặt chính sách này, thì kể từ phiên bản M77, <ph name="PRODUCT_NAME" /> có thể thu thập hoặc tải các nhật ký đó lên theo mặc định nếu hệ thống coi hồ sơ trình duyệt là được quản lý, tức là nếu hồ sơ nhận được chính sách cấp đám mây hoặc máy và không phải là hồ sơ con, hồ sơ tạm thời, hồ sơ đăng nhập hoặc hồ sơ ẩn danh.
-
-      Các nhật ký này chứa thông tin chẩn đoán hữu ích khi gỡ lỗi các vấn đề về cuộc gọi thoại hoặc video trên Chrome, chẳng hạn như thời gian và kích thước gói RTP gửi đi và nhận được, phản hồi về tình trạng nghẽn mạng cũng như siêu dữ liệu về thời gian và chất lượng của khung video và âm thanh. Các nhật ký này không chứa nội dung âm thanh hoặc video của cuộc gọi.
-
-      Chỉ các dịch vụ web của Google, chẳng hạn như Google Hangouts hoặc Google Meet, mới có thể kích hoạt chức năng thu thập dữ liệu này trên Chrome.
-
-      Thông qua mã phiên, Google có thể liên kết các nhật ký này với các nhật ký khác do dịch vụ của Google tự thu thập, nhằm giúp quá trình gỡ lỗi diễn ra dễ dàng hơn.
-      </translation>
 <translation id="7632724434767231364">Tên thư viện GSSAPI</translation>
 <translation id="7635471475589566552">Định cấu hình ngôn ngữ ứng dụng trong <ph name="PRODUCT_NAME" /> và ngăn người dùng thay đổi ngôn ngữ này. Nếu bạn bật cài đặt này, <ph name="PRODUCT_NAME" /> sẽ sử dụng ngôn ngữ được chỉ định. Nếu ngôn ngữ được định cấu hình không được hỗ trợ, 'en-US' sẽ được sử dụng thay thế. Nếu bạn tắt hoặc không thiết lập cài đặt này, <ph name="PRODUCT_NAME" /> sẽ sử dụng ngôn ngữ ưa thích do người dùng chỉ định (nếu được định cấu hình), ngôn ngữ hệ thống hoặc ngôn ngữ dự phòng 'en-US'.</translation>
 <translation id="7643883929273267746">Hạn chế các tài khoản được hiển thị trong <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 950052a..5993ab5 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -236,13 +236,6 @@
           此政策可为更具体的 <ph name="IDLE_ACTION_AC_POLICY_NAME" /> 和 <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> 政策提供后备值。如果设置了此政策,但未分别设置更具体的政策,系统就会使用此值。
 
           如果未设置此政策,更具体政策的行为不会受到影响。</translation>
-<translation id="1383493480903114193">此政策会强制网络代码在浏览器进程中运行。
-
-      此政策默认处于停用状态;若被启用,则会在网络进程被沙盒化后使用户面临安全问题的威胁。
-
-      此政策旨在使企业有机会迁移到不依靠与网络 API 挂钩来运行的第三方软件。我们建议通过 LSP 和 Win32 API 修补来使用代理服务器。
-
-      如果此政策未设置,网络代码可能会在浏览器进程之外运行,具体取决于 NetworkService 实验的现场试验。</translation>
 <translation id="1384459581748403878">参考页面:<ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">报告操作系统更新状态</translation>
 <translation id="1393485621820363363">已启用企业设备打印机</translation>
@@ -4088,21 +4081,6 @@
       如果设置了此政策,则可在未成年用户的设备上验证家长访问码。
       如果未设置此政策,则无法在未成年用户的设备上验证家长访问码。</translation>
 <translation id="7625444193696794922">指定该设备应锁定到的发布渠道。</translation>
-<translation id="7625498350540361483">
-      如果此政策设为 true,<ph name="PRODUCT_NAME" /> 便可以从 Google 服务(例如 Google Meet)收集 WebRTC 事件日志,并将这些日志上传到 Google。
-
-      如果此政策设为 false,<ph name="PRODUCT_NAME" /> 将不会收集或上传此类日志。
-
-      如果此政策未设置(在 M76 及较早版本中),<ph name="PRODUCT_NAME" /> 将不会收集或上传此类日志。
-
-      如果此政策未设置(从 M77 开始),在默认情况下,<ph name="PRODUCT_NAME" /> 可以收集或上传此类日志,但需满足以下条件:浏览器个人资料被视为托管(即,该个人资料能接收云端或计算机级别政策),并且不是孩子个人资料、临时个人资料、登录个人资料和无痕个人资料中的任一种。
-
-      这些日志中包含一些诊断信息,例如 RTP 数据包的收发时间和大小、网络拥堵情况反馈,以及与语音帧和视频帧的时间和质量相关的元数据。在调试 Chrome 中的语音通话或视频通话问题时,这些信息非常有用。这些日志不包含通话期间的语音内容或视频内容。
-
-      这项由 Chrome 执行的数据收集操作只能由 Google 的网络服务(例如 Google Hangouts 或 Google Meet)触发。
-
-      Google 可能会利用会话 ID 将这些日志与 Google 服务自身收集的其他日志关联,以便更轻松地进行调试。
-      </translation>
 <translation id="7632724434767231364">GSSAPI 库名称</translation>
 <translation id="7635471475589566552">在 <ph name="PRODUCT_NAME" />中配置应用的语言区域,并禁止用户更改语言区域。如果您启用了此设置,<ph name="PRODUCT_NAME" />就会使用指定的语言区域。如果配置的语言区域不受支持,就会改用“en-US”。如果已停用或未配置此设置,<ph name="PRODUCT_NAME" />就会使用由用户指定的首选语言区域(如果已配置)、系统语言区域或备用语言区域“en-US”。</translation>
 <translation id="7643883929273267746">限制可在<ph name="PRODUCT_NAME" />中显示的帐号</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 0c62031..b701609 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -241,13 +241,6 @@
           這項政策會針對內容更具體的 <ph name="IDLE_ACTION_AC_POLICY_NAME" /> 和 <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> 政策提供備用值。如果設定這項政策,但未設定內容更具體的相關政策,系統就會使用這項政策的值。
 
           如果不設定這項政策,內容更具體的政策行為將不會受到影響。</translation>
-<translation id="1383493480903114193">這項政策會強制網路程式碼在瀏覽器程序中執行。
-
-      這項政策預設為停用;如果你啟用政策,當網路程序受到沙箱保護時,使用者就可能會遇到安全性問題。
-
-      設置這項政策是為了讓企業能轉換到不需掛接網路 API 的第三方軟體。建議你在 LSP 和 Win32 API 修補程式使用 Proxy 伺服器。
-
-      如果不設定這項政策,網路程式碼可能會在瀏覽器程序外執行 (取決於 NetworkService 實驗的實測結果)。</translation>
 <translation id="1384459581748403878">參考頁面:<ph name="REFERENCE_URL" /></translation>
 <translation id="138847842893090358">回報作業系統的更新狀態</translation>
 <translation id="1393485621820363363">已啟用企業裝置印表機</translation>
@@ -4115,21 +4108,6 @@
 這項政策應用於逐步輪換存取碼設定。新設定一律會加到 |future_config| 中,同時
       現有值會移到 |current_config| 中。|current_config| 先前的值則會移到 |old_configs|,並在輪換結束後移除。這項政策只適用於兒童使用者。如果設定這項政策,系統將可在兒童使用者裝置上驗證家長存取碼。如果不設定這項政策,系統將無法在兒童使用者裝置上驗證家長存取碼。</translation>
 <translation id="7625444193696794922">指定裝置的固定發布頻道。</translation>
-<translation id="7625498350540361483">
-      如果將這項政策設為 True,<ph name="PRODUCT_NAME" /> 可以從 Google 服務 (例如 Google Meet) 收集 WebRTC 事件記錄,並將這些記錄上傳至 Google。
-
-      如果將這項政策設為 False,則 <ph name="PRODUCT_NAME" /> 不會收集及上傳這些記錄。
-
-      如果未設定這項政策,則 M76 以下版本 (包含 M76 版) 的 <ph name="PRODUCT_NAME" /> 不會收集及上傳這些記錄。
-
-      自 M77 版起,如果未設定這項政策,當瀏覽器設定檔處於受管理狀態 (亦即,當設定檔能接收雲端或電腦層級的政策),且不屬於子項設定檔、暫時設定檔、登入設定檔或無痕模式設定檔時,<ph name="PRODUCT_NAME" /> 預設會收集或上傳這類記錄。
-
-      這些記錄包含的診斷資訊有助於偵錯 Chrome 中的語音或視訊通話問題,例如收發 RTP 封包的時間和大小、回報網路壅塞情形,以及有關語音與視訊畫格的時間和品質等中繼資料。這些記錄中不會包含通話的語音和視訊內容。
-
-      這項由 Chrome 執行的資料收集作業只會由 Google 的網路服務觸發,例如 Google Hangouts 或 Google Meet。
-
-      Google 可能會依照工作階段 ID 將這些記錄與 Google 服務本身收集的其他記錄建立關聯,目的是簡化偵錯作業。
-      </translation>
 <translation id="7632724434767231364">GSSAPI 資料庫名稱</translation>
 <translation id="7635471475589566552">設定「<ph name="PRODUCT_NAME" />」的應用程式語言代碼,並且禁止使用者變更語言代碼。如果你啟用這項設定,「<ph name="PRODUCT_NAME" />」就會使用指定的語言代碼。如果設定的語言代碼不受支援,就會改用「en-US」。如果停用或尚未調整這項設定,「<ph name="PRODUCT_NAME" />」就會使用使用者指定的偏好語言代碼 (如果已設定)、系統語言代碼或備用語言代碼「en-US」。</translation>
 <translation id="7643883929273267746">限制在 <ph name="PRODUCT_NAME" /> 中顯示的帳戶</translation>
diff --git a/components/resources/OWNERS b/components/resources/OWNERS
index a04e915..082f9400 100644
--- a/components/resources/OWNERS
+++ b/components/resources/OWNERS
@@ -15,7 +15,6 @@
 per-file gcm_driver_resources.grdp=fgorski@chromium.org
 per-file gcm_driver_resources.grdp=jianli@chromium.org
 per-file gcm_driver_resources.grdp=peter@chromium.org
-per-file gcm_driver_resources.grdp=zea@chromium.org
 per-file neterror*=mmenke@chromium.org
 per-file neterror*=file://net/OWNERS
 per-file ntp_tiles_dev_ui_resources.grdp=file://components/ntp_tiles/OWNERS
diff --git a/components/safe_browsing/core/features.cc b/components/safe_browsing/core/features.cc
index 2e0151f..3fc1672 100644
--- a/components/safe_browsing/core/features.cc
+++ b/components/safe_browsing/core/features.cc
@@ -39,9 +39,9 @@
     "SafeBrowsingCommittedInterstitials", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kContentComplianceEnabled{
-    "ContentComplianceEnabled", base::FEATURE_DISABLED_BY_DEFAULT};
+    "SafeBrowsingContentComplianceEnabled", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kMalwareScanEnabled{"MalwareScanEnabled",
+const base::Feature kMalwareScanEnabled{"SafeBrowsingMalwareScanEnabled",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kPasswordProtectionForSavedPasswords{
diff --git a/components/strings/components_chromium_strings_ar.xtb b/components/strings/components_chromium_strings_ar.xtb
index e34fbb7..7190a867 100644
--- a/components/strings/components_chromium_strings_ar.xtb
+++ b/components/strings/components_chromium_strings_ar.xtb
@@ -16,7 +16,7 @@
           <ph name="PROXIES_TITLE" />
           &gt;
           إعدادات الشبكة المحلية
-          وألغ تحديد مربع الاختيار "استخدام خادم وكيل لشبكة الاتصال المحلية".</translation>
+          وألغ وضع علامة في مربّع الاختيار "استخدام خادم وكيل لشبكة الاتصال المحلية".</translation>
 <translation id="48558539577516920">‏اسمح لـ Chromium بالدخول إلى الشبكة من خلال إعدادات الجدار الناري أو
         برنامج مكافحة الفيروسات.</translation>
 <translation id="580822234363523061">‏انتقل إلى
diff --git a/components/variations/field_trial_config/field_trial_testing_config_schema.json b/components/variations/field_trial_config/field_trial_testing_config_schema.json
index 16f5380b..13e731a6b 100644
--- a/components/variations/field_trial_config/field_trial_testing_config_schema.json
+++ b/components/variations/field_trial_config/field_trial_testing_config_schema.json
@@ -4,7 +4,7 @@
 
 {
   "type_name": "FieldTrialTestingConfig",
-  "headers": ["components/variations/proto/study.pb.h"],
+  "headers": ["base/optional.h", "components/variations/proto/study.pb.h"],
   "schema": [{
     "field": "studies",
     "type": "array",
@@ -33,9 +33,9 @@
               },
               {
                 "field": "is_low_end_device",
-                "type": "enum",
-                "ctype": "Study::OptionalBool",
-                "default": "Study::OPTIONAL_BOOL_MISSING",
+                "type": "class",
+                "ctype": "base::Optional<bool>",
+                "default": "base::nullopt",
                 "optional": "True"
               },
               {
diff --git a/components/variations/field_trial_config/field_trial_util.cc b/components/variations/field_trial_config/field_trial_util.cc
index 2c85d68..0250e1a 100644
--- a/components/variations/field_trial_config/field_trial_util.cc
+++ b/components/variations/field_trial_config/field_trial_util.cc
@@ -16,6 +16,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/optional.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
 #include "components/variations/field_trial_config/fieldtrial_testing_config.h"
@@ -39,13 +40,11 @@
 // is_low_end_device than the current system value does.
 // If experiment has is_low_end_device missing, then it is False.
 bool HasDeviceLevelMismatch(const FieldTrialTestingExperiment& experiment) {
-  if (experiment.is_low_end_device == Study::OPTIONAL_BOOL_MISSING) {
+  if (!experiment.is_low_end_device.has_value()) {
     return false;
   }
-  if (base::SysInfo::IsLowEndDevice()) {
-    return experiment.is_low_end_device == Study::OPTIONAL_BOOL_FALSE;
-  }
-  return experiment.is_low_end_device == Study::OPTIONAL_BOOL_TRUE;
+  return experiment.is_low_end_device.value() !=
+         base::SysInfo::IsLowEndDevice();
 }
 
 // Gets current form factor and converts it from enum DeviceFormFactor to enum
diff --git a/components/variations/field_trial_config/field_trial_util_unittest.cc b/components/variations/field_trial_config/field_trial_util_unittest.cc
index 070defa..ea3409e 100644
--- a/components/variations/field_trial_config/field_trial_util_unittest.cc
+++ b/components/variations/field_trial_config/field_trial_util_unittest.cc
@@ -11,9 +11,11 @@
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
+#include "base/optional.h"
 #include "base/stl_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/system/sys_info.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/variations/field_trial_config/fieldtrial_testing_config.h"
 #include "components/variations/variations_associated_data.h"
 #include "components/variations/variations_seed_processor.h"
@@ -111,17 +113,17 @@
   const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params_0[] =
       {{"x", "1"}, {"y", "2"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = {
-      {"TestGroup1", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup1", &platform, 1, {}, 0, base::nullopt,
        array_kFieldTrialConfig_params_0, 2, nullptr, 0, nullptr, 0, nullptr,
        nullptr, 0},
   };
   const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params_1[] =
       {{"x", "3"}, {"y", "4"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = {
-      {"TestGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup2", &platform, 1, {}, 0, base::nullopt,
        array_kFieldTrialConfig_params_0, 2, nullptr, 0, nullptr, 0, nullptr,
        nullptr, 0},
-      {"TestGroup2-2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup2-2", &platform, 1, {}, 0, base::nullopt,
        array_kFieldTrialConfig_params_1, 2, nullptr, 0, nullptr, 0, nullptr,
        nullptr, 0},
   };
@@ -175,7 +177,7 @@
   for (size_t i = 0; i < base::size(all_platforms); ++i) {
     const Study::Platform platform = all_platforms[i];
     const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-        {"TestGroup", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+        {"TestGroup", &platform, 1, {}, 0, base::nullopt,
          array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
          nullptr, 0},
     };
@@ -211,7 +213,7 @@
   const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] =
       {{"x", "1"}, {"y", "2"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-      {"TestGroup", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup", &platform, 1, {}, 0, base::nullopt,
        array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
        nullptr, 0},
   };
@@ -242,7 +244,7 @@
   const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] =
       {{"x", "1"}, {"y", "2"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-      {"TestGroup", platforms, 2, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup", platforms, 2, {}, 0, base::nullopt,
        array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
        nullptr, 0},
   };
@@ -277,7 +279,7 @@
   const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] =
       {{"x", "1"}, {"y", "2"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-      {"TestGroup", &platform, 1, form_factors, 4, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup", &platform, 1, form_factors, 4, base::nullopt,
        array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
        nullptr, 0},
   };
@@ -312,9 +314,9 @@
   const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] =
         {{"x", "1"}, {"y", "2"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-      {"TestGroup", &platform, 1, &form_factor, 1,
-       Study::OPTIONAL_BOOL_MISSING, array_kFieldTrialConfig_params, 2,
-       nullptr, 0, nullptr, 0, nullptr, nullptr, 0},
+      {"TestGroup", &platform, 1, &form_factor, 1, base::nullopt,
+       array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
+       nullptr, 0},
   };
   const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
       {"TestTrial", array_kFieldTrialConfig_experiments, 1}
@@ -355,9 +357,9 @@
     const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] =
         {{"x", "1"}, {"y", "2"}};
     const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-        {"TestGroup", &platform, 1, &form_factor, 1,
-         Study::OPTIONAL_BOOL_MISSING, array_kFieldTrialConfig_params, 2,
-         nullptr, 0, nullptr, 0, nullptr, nullptr, 0},
+        {"TestGroup", &platform, 1, &form_factor, 1, base::nullopt,
+         array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
+         nullptr, 0},
     };
     const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] =
         {{"TestTrial", array_kFieldTrialConfig_experiments, 1}};
@@ -391,13 +393,13 @@
 
   const Study::Platform platform = Study::PLATFORM_LINUX;
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = {
-      {"TestGroup1", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr,
+      {"TestGroup1", &platform, 1, {}, 0, base::nullopt, nullptr,
        0, enable_features, 2, nullptr, 0, nullptr, nullptr, 0},
   };
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = {
-      {"TestGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr,
+      {"TestGroup2", &platform, 1, {}, 0, base::nullopt, nullptr,
        0, nullptr, 0, disable_features, 2, nullptr, nullptr, 0},
-      {"TestGroup2-2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"TestGroup2-2", &platform, 1, {}, 0, base::nullopt,
        nullptr, 0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0},
   };
 
@@ -434,20 +436,20 @@
 TEST_F(FieldTrialUtilTest, AssociateForcingFlagsFromFieldTrialConfig) {
   const Study::Platform platform = Study::PLATFORM_LINUX;
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = {
-      {"TestGroup1", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr,
+      {"TestGroup1", &platform, 1, {}, 0, base::nullopt, nullptr,
        0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = {
-      {"TestGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr,
+      {"TestGroup2", &platform, 1, {}, 0, base::nullopt, nullptr,
        0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0},
-      {"ForcedGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"ForcedGroup2", &platform, 1, {}, 0, base::nullopt,
        nullptr, 0, nullptr, 0, nullptr, 0, "flag-2", nullptr, 0},
   };
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_2[] = {
-      {"TestGroup3", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr,
+      {"TestGroup3", &platform, 1, {}, 0, base::nullopt, nullptr,
        0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0},
-      {"ForcedGroup3", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"ForcedGroup3", &platform, 1, {}, 0, base::nullopt,
        nullptr, 0, nullptr, 0, nullptr, 0, "flag-3", nullptr, 0},
-      {"ForcedGroup3-2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING,
+      {"ForcedGroup3-2", &platform, 1, {}, 0, base::nullopt,
        nullptr, 0, nullptr, 0, nullptr, 0, "flag-3-2", nullptr, 0},
   };
   const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
@@ -481,9 +483,8 @@
   const OverrideUIString array_kFieldTrialConfig_override_ui_string[] =
         {{1234, "test1"}, {5678, "test2"}};
   const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
-      {"TestGroup", &platform, 1, nullptr, 0,
-       Study::OPTIONAL_BOOL_MISSING, array_kFieldTrialConfig_params, 2,
-       nullptr, 0, nullptr, 0, nullptr,
+      {"TestGroup", &platform, 1, nullptr, 0, base::nullopt,
+       array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr,
        array_kFieldTrialConfig_override_ui_string, 2},
   };
   const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
@@ -519,6 +520,63 @@
   EXPECT_EQ(base::ASCIIToUTF16("test2"), it->second);
 }
 
+TEST_F(FieldTrialUtilTest,
+       AssociateParamsFromFieldTrialConfigWithIsLowEndDeviceMatch) {
+  const Study::Platform platform = Study::PLATFORM_WINDOWS;
+  const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] = {
+      {"x", "1"}, {"y", "2"}};
+  const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
+      {"TestGroup", &platform, 1, {}, 0, base::SysInfo::IsLowEndDevice(),
+       array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr},
+  };
+  const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
+      {"TestTrial", array_kFieldTrialConfig_experiments, 1}};
+  const FieldTrialTestingConfig kConfig = {array_kFieldTrialConfig_studies, 1};
+
+  // The is_low_end_device filter matches, so trial should be added.
+  base::FeatureList feature_list;
+  AssociateParamsFromFieldTrialConfig(kConfig, override_callback_.callback(),
+                                      platform, &feature_list);
+
+  EXPECT_EQ("1", GetVariationParamValue("TestTrial", "x"));
+  EXPECT_EQ("2", GetVariationParamValue("TestTrial", "y"));
+
+  std::map<std::string, std::string> params;
+  EXPECT_TRUE(GetVariationParams("TestTrial", &params));
+  EXPECT_EQ(2U, params.size());
+  EXPECT_EQ("1", params["x"]);
+  EXPECT_EQ("2", params["y"]);
+
+  EXPECT_EQ("TestGroup", base::FieldTrialList::FindFullName("TestTrial"));
+}
+
+TEST_F(FieldTrialUtilTest,
+       AssociateParamsFromFieldTrialConfigWithIsLowEndDeviceMismatch) {
+  const Study::Platform platform = Study::PLATFORM_WINDOWS;
+  const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] = {
+      {"x", "1"}, {"y", "2"}};
+  const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
+      {"TestGroup", &platform, 1, {}, 0, !base::SysInfo::IsLowEndDevice(),
+       array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr},
+  };
+  const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
+      {"TestTrial", array_kFieldTrialConfig_experiments, 1}};
+  const FieldTrialTestingConfig kConfig = {array_kFieldTrialConfig_studies, 1};
+
+  // The is_low_end_device don't match, so trial shouldn't be added.
+  base::FeatureList feature_list;
+  AssociateParamsFromFieldTrialConfig(kConfig, override_callback_.callback(),
+                                      platform, &feature_list);
+
+  EXPECT_EQ("", GetVariationParamValue("TestTrial", "x"));
+  EXPECT_EQ("", GetVariationParamValue("TestTrial", "y"));
+
+  std::map<std::string, std::string> params;
+  EXPECT_FALSE(GetVariationParams("TestTrial", &params));
+
+  EXPECT_EQ("", base::FieldTrialList::FindFullName("TestTrial"));
+}
+
 TEST_F(FieldTrialUtilTest, TestEscapeValue) {
   std::string str = "trail.:/,*";
   std::string escaped_str = EscapeValue(str);
diff --git a/content/browser/android/background_sync_network_observer_android.cc b/content/browser/android/background_sync_network_observer_android.cc
index a47a5801..234a339 100644
--- a/content/browser/android/background_sync_network_observer_android.cc
+++ b/content/browser/android/background_sync_network_observer_android.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/task/post_task.h"
+#include "base/trace_event/trace_event.h"
 #include "content/public/android/content_jni_headers/BackgroundSyncNetworkObserver_jni.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/service_worker_context.h"
@@ -29,6 +30,8 @@
 }
 
 void BackgroundSyncNetworkObserverAndroid::Observer::Init() {
+  TRACE_EVENT0("startup",
+               "BackgroundSyncNetworkObserverAndroid::Observer::Init");
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // Attach a Java BackgroundSyncNetworkObserver object. Its lifetime will be
   // scoped to the lifetime of this object.
diff --git a/content/browser/frame_host/navigation_request_browsertest.cc b/content/browser/frame_host/navigation_request_browsertest.cc
index 38de5db..1ff7285 100644
--- a/content/browser/frame_host/navigation_request_browsertest.cc
+++ b/content/browser/frame_host/navigation_request_browsertest.cc
@@ -1643,7 +1643,7 @@
 
   EXPECT_TRUE(observer.has_committed());
   EXPECT_TRUE(observer.is_error());
-  EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, observer.net_error_code());
+  EXPECT_EQ(net::ERR_DNS_TIMED_OUT, observer.net_error_code());
   EXPECT_EQ(net::ERR_DNS_TIMED_OUT, observer.resolve_error_info().error);
 }
 
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index ab1e349..9dd22cf5 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -726,6 +726,8 @@
 // Enables access to experimental WebXR features.
 const base::Feature kWebXrIncubations{"WebXRIncubations",
                                       base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kWebXrPermissionsApi{"WebXrPermissionsApi",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Start streaming scripts on script preload.
 const base::Feature kScriptStreamingOnPreload{"ScriptStreamingOnPreload",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 96958552..a37ad87 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -151,6 +151,7 @@
 CONTENT_EXPORT extern const base::Feature kWebXrArModule;
 CONTENT_EXPORT extern const base::Feature kWebXrHitTest;
 CONTENT_EXPORT extern const base::Feature kWebXrIncubations;
+CONTENT_EXPORT extern const base::Feature kWebXrPermissionsApi;
 CONTENT_EXPORT extern const base::Feature kScriptStreamingOnPreload;
 CONTENT_EXPORT extern const base::Feature kTrustedDOMTypes;
 CONTENT_EXPORT extern const base::Feature kBrowserUseDisplayThreadPriority;
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.h b/content/renderer/service_worker/embedded_worker_instance_client_impl.h
index e24fc752..88628a2e 100644
--- a/content/renderer/service_worker/embedded_worker_instance_client_impl.h
+++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.h
@@ -12,8 +12,8 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "third_party/blink/public/mojom/service_worker/embedded_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
-#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom-forward.h"
+#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-forward.h"
 #include "third_party/blink/public/web/web_embedded_worker_start_data.h"
 
 namespace content {
diff --git a/content/renderer/service_worker/navigation_preload_request.h b/content/renderer/service_worker/navigation_preload_request.h
index 8e58bfc..fb26d3a 100644
--- a/content/renderer/service_worker/navigation_preload_request.h
+++ b/content/renderer/service_worker/navigation_preload_request.h
@@ -12,7 +12,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/data_pipe.h"
-#include "services/network/public/mojom/url_loader.mojom.h"
+#include "services/network/public/mojom/url_loader.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/dispatch_fetch_event_params.mojom.h"
 #include "third_party/blink/public/platform/web_url_response.h"
 #include "url/gurl.h"
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index f7c183f..0189f17f 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -25,17 +25,17 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/shared_associated_remote.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom.h"
+#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-forward.h"
 #include "third_party/blink/public/mojom/blob/blob_registry.mojom.h"
-#include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
+#include "third_party/blink/public/mojom/payments/payment_app.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/embedded_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom-forward.h"
+#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom-forward.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_error.h"
 #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h"
 #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h"
diff --git a/content/renderer/service_worker/service_worker_fetch_context_impl.h b/content/renderer/service_worker/service_worker_fetch_context_impl.h
index 27e2e38..cc297af 100644
--- a/content/renderer/service_worker/service_worker_fetch_context_impl.h
+++ b/content/renderer/service_worker/service_worker_fetch_context_impl.h
@@ -11,7 +11,7 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom-forward.h"
 #include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
 #include "url/gurl.h"
diff --git a/content/renderer/service_worker/service_worker_network_provider_for_frame.h b/content/renderer/service_worker/service_worker_network_provider_for_frame.h
index 420955b..d70fe50 100644
--- a/content/renderer/service_worker/service_worker_network_provider_for_frame.h
+++ b/content/renderer/service_worker/service_worker_network_provider_for_frame.h
@@ -10,8 +10,8 @@
 #include "content/common/content_export.h"
 #include "content/renderer/service_worker/service_worker_provider_context.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom-forward.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 
 namespace content {
diff --git a/content/renderer/service_worker/service_worker_provider_context.h b/content/renderer/service_worker/service_worker_provider_context.h
index 5e51897b..83527ee 100644
--- a/content/renderer/service_worker/service_worker_provider_context.h
+++ b/content/renderer/service_worker/service_worker_provider_context.h
@@ -26,12 +26,12 @@
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_container.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom-forward.h"
 #include "third_party/blink/public/mojom/timing/worker_timing_container.mojom-forward.h"
-#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h"
+#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-forward.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h"
 
 namespace base {
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.h b/content/renderer/service_worker/service_worker_subresource_loader.h
index 60c0cd0..3578b3e 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.h
+++ b/content/renderer/service_worker/service_worker_subresource_loader.h
@@ -21,9 +21,9 @@
 #include "net/url_request/redirect_info.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/mojom/blob/blob.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
+#include "third_party/blink/public/mojom/blob/blob.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom-forward.h"
 #include "third_party/blink/public/mojom/timing/worker_timing_container.mojom-forward.h"
 
 namespace network {
diff --git a/content/renderer/service_worker/service_worker_type_converters.h b/content/renderer/service_worker/service_worker_type_converters.h
index 2fbf6a9..d498162 100644
--- a/content/renderer/service_worker/service_worker_type_converters.h
+++ b/content/renderer/service_worker/service_worker_type_converters.h
@@ -8,8 +8,8 @@
 #include <memory>
 
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_object_info.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_registration_object_info.h"
diff --git a/content/renderer/service_worker/web_service_worker_provider_impl.h b/content/renderer/service_worker/web_service_worker_provider_impl.h
index ea24626..4a7d37da 100644
--- a/content/renderer/service_worker/web_service_worker_provider_impl.h
+++ b/content/renderer/service_worker/web_service_worker_provider_impl.h
@@ -13,9 +13,9 @@
 #include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
 #include "third_party/blink/public/common/messaging/transferable_message.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h"
+#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-forward.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h"
 
 namespace blink {
diff --git a/content/renderer/worker/dedicated_worker_host_factory_client.h b/content/renderer/worker/dedicated_worker_host_factory_client.h
index 65abffe..b851aa9 100644
--- a/content/renderer/worker/dedicated_worker_host_factory_client.h
+++ b/content/renderer/worker/dedicated_worker_host_factory_client.h
@@ -10,8 +10,8 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h"
-#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
+#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom-forward.h"
+#include "third_party/blink/public/mojom/renderer_preferences.mojom-forward.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host.mojom.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom.h"
 #include "third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h"
diff --git a/content/renderer/worker/embedded_shared_worker_stub.cc b/content/renderer/worker/embedded_shared_worker_stub.cc
index 869ebe53..d4e4ec5 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/worker/embedded_shared_worker_stub.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/loader/url_loader_factory_bundle.h"
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
+#include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/web/web_shared_worker.h"
diff --git a/content/renderer/worker/embedded_shared_worker_stub.h b/content/renderer/worker/embedded_shared_worker_stub.h
index c62d5bc..676f67c2 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.h
+++ b/content/renderer/worker/embedded_shared_worker_stub.h
@@ -15,17 +15,17 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/network/public/mojom/url_loader_factory.mojom.h"
-#include "third_party/blink/public/mojom/browser_interface_broker.mojom.h"
-#include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
-#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h"
+#include "services/network/public/mojom/url_loader_factory.mojom-forward.h"
+#include "third_party/blink/public/mojom/browser_interface_broker.mojom-forward.h"
+#include "third_party/blink/public/mojom/devtools/devtools_agent.mojom-forward.h"
+#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom-forward.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom-forward.h"
 #include "third_party/blink/public/mojom/worker/shared_worker.mojom.h"
 #include "third_party/blink/public/mojom/worker/shared_worker_host.mojom.h"
 #include "third_party/blink/public/mojom/worker/shared_worker_info.mojom.h"
-#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom.h"
+#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-forward.h"
 #include "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom.h"
 #include "third_party/blink/public/platform/web_content_security_policy.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
diff --git a/content/renderer/worker/shared_worker_factory_impl.h b/content/renderer/worker/shared_worker_factory_impl.h
index 295981a..1665c90 100644
--- a/content/renderer/worker/shared_worker_factory_impl.h
+++ b/content/renderer/worker/shared_worker_factory_impl.h
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom-forward.h"
 #include "third_party/blink/public/mojom/worker/shared_worker_factory.mojom.h"
 
 namespace blink {
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 7178258..cd8ac015 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -199,9 +199,6 @@
 # Produces blank images on Intel HD 630 w/ Mesa 19.0.2
 crbug.com/976861 [ linux intel-0x5912 ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ]
 
-# Flakes regularly on Mac.
-crbug.com/1040202 [ mac ] Pixel_CSSFilterEffects_NoOverlays [ Failure ]
-
 # Skip swap chain tests on non-Windows
 [ android ] Pixel_CanvasLowLatency2DSwapChain [ Skip ]
 [ android ] Pixel_CanvasLowLatencyWebGLSwapChain [ Skip ]
diff --git a/device/bluetooth/adapter.h b/device/bluetooth/adapter.h
index d885cda..344741f 100644
--- a/device/bluetooth/adapter.h
+++ b/device/bluetooth/adapter.h
@@ -13,7 +13,7 @@
 #include "device/bluetooth/bluetooth_adapter.h"
 #include "device/bluetooth/bluetooth_gatt_connection.h"
 #include "device/bluetooth/public/mojom/adapter.mojom.h"
-#include "device/bluetooth/public/mojom/device.mojom.h"
+#include "device/bluetooth/public/mojom/device.mojom-forward.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 
diff --git a/device/bluetooth/bluetooth_adapter_factory.h b/device/bluetooth/bluetooth_adapter_factory.h
index e80a0d1..a268d00 100644
--- a/device/bluetooth/bluetooth_adapter_factory.h
+++ b/device/bluetooth/bluetooth_adapter_factory.h
@@ -15,7 +15,7 @@
 
 #if defined(OS_CHROMEOS)
 #include "mojo/public/cpp/bindings/pending_remote.h"
-#include "services/data_decoder/public/mojom/ble_scan_parser.mojom.h"
+#include "services/data_decoder/public/mojom/ble_scan_parser.mojom-forward.h"
 #endif  // defined(OS_CHROMEOS)
 
 namespace device {
diff --git a/device/bluetooth/public/mojom/test/fake_bluetooth_mojom_traits.h b/device/bluetooth/public/mojom/test/fake_bluetooth_mojom_traits.h
index 4438307..57774f3 100644
--- a/device/bluetooth/public/mojom/test/fake_bluetooth_mojom_traits.h
+++ b/device/bluetooth/public/mojom/test/fake_bluetooth_mojom_traits.h
@@ -10,7 +10,7 @@
 #include <tuple>
 
 #include "device/bluetooth/bluetooth_device.h"
-#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
+#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom-forward.h"
 
 namespace mojo {
 
diff --git a/device/bluetooth/public/mojom/uuid_mojom_traits.h b/device/bluetooth/public/mojom/uuid_mojom_traits.h
index 1810976..bea4b50 100644
--- a/device/bluetooth/public/mojom/uuid_mojom_traits.h
+++ b/device/bluetooth/public/mojom/uuid_mojom_traits.h
@@ -8,7 +8,7 @@
 #include <string>
 
 #include "device/bluetooth/public/cpp/bluetooth_uuid.h"
-#include "device/bluetooth/public/mojom/uuid.mojom.h"
+#include "device/bluetooth/public/mojom/uuid.mojom-forward.h"
 
 namespace mojo {
 
diff --git a/device/bluetooth/test/fake_bluetooth.h b/device/bluetooth/test/fake_bluetooth.h
index 78f183d..3d75d28 100644
--- a/device/bluetooth/test/fake_bluetooth.h
+++ b/device/bluetooth/test/fake_bluetooth.h
@@ -8,7 +8,7 @@
 
 #include "base/compiler_specific.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
-#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
+#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom-forward.h"
 #include "device/bluetooth/test/fake_central.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 
diff --git a/device/bluetooth/test/fake_remote_gatt_characteristic.h b/device/bluetooth/test/fake_remote_gatt_characteristic.h
index c7bcef3..8661be2 100644
--- a/device/bluetooth/test/fake_remote_gatt_characteristic.h
+++ b/device/bluetooth/test/fake_remote_gatt_characteristic.h
@@ -12,7 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
 #include "device/bluetooth/public/cpp/bluetooth_uuid.h"
-#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
+#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom-forward.h"
 #include "device/bluetooth/test/fake_read_response.h"
 #include "device/bluetooth/test/fake_remote_gatt_descriptor.h"
 
diff --git a/device/bluetooth/test/fake_remote_gatt_service.h b/device/bluetooth/test/fake_remote_gatt_service.h
index 8367927..267c32c65 100644
--- a/device/bluetooth/test/fake_remote_gatt_service.h
+++ b/device/bluetooth/test/fake_remote_gatt_service.h
@@ -11,7 +11,7 @@
 
 #include "device/bluetooth/bluetooth_remote_gatt_service.h"
 #include "device/bluetooth/public/cpp/bluetooth_uuid.h"
-#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
+#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom-forward.h"
 #include "device/bluetooth/test/fake_remote_gatt_characteristic.h"
 
 namespace device {
diff --git a/device/fido/hid/fido_hid_discovery.h b/device/fido/hid/fido_hid_discovery.h
index 34c14b4..f345f91 100644
--- a/device/fido/hid/fido_hid_discovery.h
+++ b/device/fido/hid/fido_hid_discovery.h
@@ -17,7 +17,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/cpp/hid/hid_device_filter.h"
-#include "services/device/public/mojom/hid.mojom.h"
+#include "services/device/public/mojom/hid.mojom-forward.h"
 
 namespace device {
 
diff --git a/device/gamepad/gamepad_data_fetcher.h b/device/gamepad/gamepad_data_fetcher.h
index 9be2e16b..561756b 100644
--- a/device/gamepad/gamepad_data_fetcher.h
+++ b/device/gamepad/gamepad_data_fetcher.h
@@ -10,7 +10,7 @@
 #include "device/gamepad/gamepad_export.h"
 #include "device/gamepad/gamepad_pad_state_provider.h"
 #include "device/gamepad/public/cpp/gamepad.h"
-#include "device/gamepad/public/mojom/gamepad.mojom.h"
+#include "device/gamepad/public/mojom/gamepad.mojom-forward.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
diff --git a/device/gamepad/gamepad_service.h b/device/gamepad/gamepad_service.h
index ccba061..c77fc10 100644
--- a/device/gamepad/gamepad_service.h
+++ b/device/gamepad/gamepad_service.h
@@ -19,7 +19,7 @@
 #include "device/gamepad/gamepad_data_fetcher.h"
 #include "device/gamepad/gamepad_export.h"
 #include "device/gamepad/gamepad_provider.h"
-#include "device/gamepad/public/mojom/gamepad.mojom.h"
+#include "device/gamepad/public/mojom/gamepad.mojom-forward.h"
 
 namespace base {
 class SingleThreadTaskRunner;
diff --git a/device/gamepad/nintendo_data_fetcher.h b/device/gamepad/nintendo_data_fetcher.h
index 776544e..663974cb 100644
--- a/device/gamepad/nintendo_data_fetcher.h
+++ b/device/gamepad/nintendo_data_fetcher.h
@@ -16,7 +16,7 @@
 #include "device/gamepad/public/cpp/gamepads.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/device/public/mojom/hid.mojom.h"
+#include "services/device/public/mojom/hid.mojom-forward.h"
 
 namespace device {
 // Nintendo controllers are not typical HID gamepads and cannot be easily
diff --git a/device/gamepad/nintendo_data_fetcher_unittest.cc b/device/gamepad/nintendo_data_fetcher_unittest.cc
index 2647fd4..b744105 100644
--- a/device/gamepad/nintendo_data_fetcher_unittest.cc
+++ b/device/gamepad/nintendo_data_fetcher_unittest.cc
@@ -28,6 +28,8 @@
 const char* kTestDeviceId = "123";
 #endif
 
+const char kPhysicalDeviceId[] = "1";
+
 void BindHidManager(mojom::DeviceService* service,
                     scoped_refptr<base::SequencedTaskRunner> task_runner,
                     mojo::PendingReceiver<mojom::HidManager> receiver) {
@@ -96,7 +98,7 @@
   auto collection = mojom::HidCollectionInfo::New();
   collection->usage = mojom::HidUsageAndPage::New(0, 0);
   scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo(
-      kTestDeviceId, 0x1234, 0xabcd, "Invalipad", "",
+      kTestDeviceId, kPhysicalDeviceId, 0x1234, 0xabcd, "Invalipad", "",
       mojom::HidBusType::kHIDBusTypeUSB, std::move(collection), 0, 0, 0));
 
   // Add the device to the mock HID service. The HID service should notify the
@@ -117,8 +119,8 @@
   auto collection = mojom::HidCollectionInfo::New();
   collection->usage = mojom::HidUsageAndPage::New(0, 0);
   scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo(
-      kTestDeviceId, 0x057e, 0x2009, "Switch Pro Controller", "",
-      mojom::HidBusType::kHIDBusTypeUSB, std::move(collection), 0, 63, 0));
+      kTestDeviceId, kPhysicalDeviceId, 0x057e, 0x2009, "Switch Pro Controller",
+      "", mojom::HidBusType::kHIDBusTypeUSB, std::move(collection), 0, 63, 0));
 
   // Add the device to the mock HID service. The HID service should notify the
   // data fetcher.
diff --git a/device/gamepad/xbox_controller_mac.h b/device/gamepad/xbox_controller_mac.h
index d6365665..ddb67bd 100644
--- a/device/gamepad/xbox_controller_mac.h
+++ b/device/gamepad/xbox_controller_mac.h
@@ -18,7 +18,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "device/gamepad/abstract_haptic_gamepad.h"
-#include "device/gamepad/public/mojom/gamepad.mojom.h"
+#include "device/gamepad/public/mojom/gamepad.mojom-forward.h"
 
 struct IOUSBDeviceStruct320;
 struct IOUSBInterfaceStruct300;
diff --git a/extensions/browser/api/hid/hid_apitest.cc b/extensions/browser/api/hid/hid_apitest.cc
index a962d9d3..29c7c4e 100644
--- a/extensions/browser/api/hid/hid_apitest.cc
+++ b/extensions/browser/api/hid/hid_apitest.cc
@@ -29,6 +29,7 @@
 using device::HidReportDescriptor;
 
 const char* const kTestDeviceGuids[] = {"A", "B", "C", "D", "E"};
+const char* const kTestPhysicalDeviceIds[] = {"1", "2", "3", "4", "5"};
 
 // These report descriptors define two devices with 8-byte input, output and
 // feature reports. The first implements usage page 0xFF00 and has a single
@@ -121,12 +122,16 @@
   void SetUpOnMainThread() override {
     ShellApiTest::SetUpOnMainThread();
 
-    AddDevice(kTestDeviceGuids[0], 0x18D1, 0x58F0, false, "A");
-    AddDevice(kTestDeviceGuids[1], 0x18D1, 0x58F0, true, "B");
-    AddDevice(kTestDeviceGuids[2], 0x18D1, 0x58F1, false, "C");
+    AddDevice(kTestDeviceGuids[0], kTestPhysicalDeviceIds[0], 0x18D1, 0x58F0,
+              false, "A");
+    AddDevice(kTestDeviceGuids[1], kTestPhysicalDeviceIds[1], 0x18D1, 0x58F0,
+              true, "B");
+    AddDevice(kTestDeviceGuids[2], kTestPhysicalDeviceIds[2], 0x18D1, 0x58F1,
+              false, "C");
   }
 
   void AddDevice(const std::string& device_guid,
+                 const std::string& physical_device_id,
                  int vendor_id,
                  int product_id,
                  bool report_id,
@@ -153,10 +158,11 @@
         &max_output_report_size, &max_feature_report_size);
 
     auto device = device::mojom::HidDeviceInfo::New(
-        device_guid, vendor_id, product_id, "Test Device", serial_number,
-        device::mojom::HidBusType::kHIDBusTypeUSB, report_descriptor,
-        std::move(collections), has_report_id, max_input_report_size,
-        max_output_report_size, max_feature_report_size, "");
+        device_guid, physical_device_id, vendor_id, product_id, "Test Device",
+        serial_number, device::mojom::HidBusType::kHIDBusTypeUSB,
+        report_descriptor, std::move(collections), has_report_id,
+        max_input_report_size, max_output_report_size, max_feature_report_size,
+        "");
 
     fake_hid_manager_->AddDevice(std::move(device));
   }
@@ -181,8 +187,10 @@
 
   // Add a blocked device first so that the test will fail if a notification is
   // received.
-  AddDevice(kTestDeviceGuids[3], 0x18D1, 0x58F1, false, "A");
-  AddDevice(kTestDeviceGuids[4], 0x18D1, 0x58F0, false, "A");
+  AddDevice(kTestDeviceGuids[3], kTestPhysicalDeviceIds[3], 0x18D1, 0x58F1,
+            false, "A");
+  AddDevice(kTestDeviceGuids[4], kTestPhysicalDeviceIds[4], 0x18D1, 0x58F0,
+            false, "A");
   ASSERT_TRUE(result_listener.WaitUntilSatisfied());
   EXPECT_EQ("success", result_listener.message());
 }
@@ -216,7 +224,8 @@
   ASSERT_TRUE(remove_listener.WaitUntilSatisfied());
 
   ExtensionTestMessageListener add_listener("added", false);
-  AddDevice(kTestDeviceGuids[0], 0x18D1, 0x58F0, true, "A");
+  AddDevice(kTestDeviceGuids[0], kTestPhysicalDeviceIds[0], 0x18D1, 0x58F0,
+            true, "A");
   ASSERT_TRUE(add_listener.WaitUntilSatisfied());
 }
 
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
index eb30a21f..6172149 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
+++ b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
@@ -479,7 +479,7 @@
   scoped_refptr<NetworkingPrivateSetPropertiesFunction> set_properties =
       new NetworkingPrivateSetPropertiesFunction();
   set_properties->set_source_context_type(Feature::WEBUI_CONTEXT);
-  set_properties->set_source_url(GURL("chrome://settings/networkDetail"));
+  set_properties->set_source_url(GURL("chrome://os-settings/networkDetail"));
 
   const char kCombinedSettings[] =
       R"({
@@ -676,7 +676,7 @@
   scoped_refptr<NetworkingPrivateCreateNetworkFunction> create_network =
       new NetworkingPrivateCreateNetworkFunction();
   create_network->set_source_context_type(Feature::WEBUI_CONTEXT);
-  create_network->set_source_url(GURL("chrome://settings/networkDetail"));
+  create_network->set_source_url(GURL("chrome://os-settings/networkDetail"));
   std::unique_ptr<base::Value> result = RunFunctionAndReturnValue(
       create_network.get(),
       base::StringPrintf("[false, %s]", kL2tpIpsecConfig));
@@ -708,7 +708,7 @@
   scoped_refptr<NetworkingPrivateSetPropertiesFunction> set_properties =
       new NetworkingPrivateSetPropertiesFunction();
   set_properties->set_source_context_type(Feature::WEBUI_CONTEXT);
-  set_properties->set_source_url(GURL("chrome://settings/networkDetail"));
+  set_properties->set_source_url(GURL("chrome://os-settings/networkDetail"));
   result = RunFunctionAndReturnValue(
       set_properties.get(),
       base::StringPrintf(
@@ -736,7 +736,7 @@
   scoped_refptr<NetworkingPrivateCreateNetworkFunction> create_network =
       new NetworkingPrivateCreateNetworkFunction();
   create_network->set_source_context_type(Feature::WEBUI_CONTEXT);
-  create_network->set_source_url(GURL("chrome://settings/networkDetail"));
+  create_network->set_source_url(GURL("chrome://os-settings/networkDetail"));
   std::unique_ptr<base::Value> result = RunFunctionAndReturnValue(
       create_network.get(), base::StringPrintf("[false, %s]", kOpenVpnConfig));
 
@@ -768,7 +768,7 @@
   scoped_refptr<NetworkingPrivateSetPropertiesFunction> set_properties =
       new NetworkingPrivateSetPropertiesFunction();
   set_properties->set_source_context_type(Feature::WEBUI_CONTEXT);
-  set_properties->set_source_url(GURL("chrome://settings/networkDetail"));
+  set_properties->set_source_url(GURL("chrome://os-settings/networkDetail"));
   result = RunFunctionAndReturnValue(
       set_properties.get(),
       base::StringPrintf(
@@ -887,7 +887,7 @@
   scoped_refptr<NetworkingPrivateCreateNetworkFunction> create_network =
       new NetworkingPrivateCreateNetworkFunction();
   create_network->set_source_context_type(Feature::WEBUI_CONTEXT);
-  create_network->set_source_url(GURL("chrome://settings/networkDetail"));
+  create_network->set_source_url(GURL("chrome://os-settings/networkDetail"));
   std::unique_ptr<base::Value> result = RunFunctionAndReturnValue(
       create_network.get(), base::StringPrintf("[false, %s]", kNetworkConfig));
   ASSERT_TRUE(result);
@@ -1112,7 +1112,7 @@
   scoped_refptr<NetworkingPrivateGetPropertiesFunction> get_properties =
       new NetworkingPrivateGetPropertiesFunction();
   get_properties->set_source_context_type(Feature::WEBUI_CONTEXT);
-  get_properties->set_source_url(GURL("chrome://settings/networkDetail"));
+  get_properties->set_source_url(GURL("chrome://os-settings/networkDetail"));
 
   std::unique_ptr<base::Value> result = RunFunctionAndReturnValue(
       get_properties.get(), base::StringPrintf(R"(["%s"])", kCellularGuid));
diff --git a/extensions/browser/api/web_request/web_request_event_details.cc b/extensions/browser/api/web_request/web_request_event_details.cc
index 677b924..834d215e 100644
--- a/extensions/browser/api/web_request/web_request_event_details.cc
+++ b/extensions/browser/api/web_request/web_request_event_details.cc
@@ -23,7 +23,6 @@
 #include "extensions/browser/api/web_request/web_request_permissions.h"
 #include "extensions/browser/api/web_request/web_request_resource_type.h"
 #include "extensions/common/permissions/permissions_data.h"
-#include "ipc/ipc_message.h"
 #include "net/base/auth.h"
 #include "net/base/upload_data_stream.h"
 #include "net/http/http_request_headers.h"
@@ -51,8 +50,7 @@
 WebRequestEventDetails::WebRequestEventDetails(const WebRequestInfo& request,
                                                int extra_info_spec)
     : extra_info_spec_(extra_info_spec),
-      render_process_id_(content::ChildProcessHost::kInvalidUniqueID),
-      render_frame_id_(MSG_ROUTING_NONE) {
+      render_process_id_(content::ChildProcessHost::kInvalidUniqueID) {
   dict_.SetString(keys::kMethodKey, request.method);
   dict_.SetString(keys::kRequestIdKey, base::NumberToString(request.id));
   dict_.SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000);
@@ -64,7 +62,6 @@
   dict_.SetInteger(keys::kParentFrameIdKey, request.frame_data.parent_frame_id);
   initiator_ = request.initiator;
   render_process_id_ = request.render_process_id;
-  render_frame_id_ = request.frame_id;
 }
 
 WebRequestEventDetails::~WebRequestEventDetails() = default;
@@ -191,7 +188,6 @@
   std::unique_ptr<WebRequestEventDetails> copy(new WebRequestEventDetails);
   copy->initiator_ = initiator_;
   copy->render_process_id_ = render_process_id_;
-  copy->render_frame_id_ = render_frame_id_;
 
   static const char* const kSafeAttributes[] = {
     "method", "requestId", "timeStamp", "type", "tabId", "frameId",
@@ -214,6 +210,6 @@
 }
 
 WebRequestEventDetails::WebRequestEventDetails()
-    : extra_info_spec_(0), render_process_id_(0), render_frame_id_(0) {}
+    : extra_info_spec_(0), render_process_id_(0) {}
 
 }  // namespace extensions
diff --git a/extensions/browser/api/web_request/web_request_event_details.h b/extensions/browser/api/web_request/web_request_event_details.h
index 2bbd918..64e28d6a 100644
--- a/extensions/browser/api/web_request/web_request_event_details.h
+++ b/extensions/browser/api/web_request/web_request_event_details.h
@@ -131,9 +131,7 @@
 
   int extra_info_spec_;
 
-  // Used to determine the tabId, frameId and parentFrameId.
   int render_process_id_;
-  int render_frame_id_;
 
   DISALLOW_COPY_AND_ASSIGN(WebRequestEventDetails);
 };
diff --git a/extensions/browser/extension_util.cc b/extensions/browser/extension_util.cc
index 41a5d79..c3231cfa 100644
--- a/extensions/browser/extension_util.cc
+++ b/extensions/browser/extension_util.cc
@@ -4,10 +4,12 @@
 
 #include "extensions/browser/extension_util.h"
 
+#include "base/no_destructor.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/site_instance.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extensions_browser_client.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/features/behavior_feature.h"
 #include "extensions/common/features/feature.h"
@@ -156,5 +158,24 @@
          !PermissionsData::CanExecuteScriptEverywhere(extension_id, location);
 }
 
+// The below functionality maps a context to a unique id by increasing a static
+// counter.
+int GetBrowserContextId(content::BrowserContext* context) {
+  using ContextIdMap = std::map<content::BrowserContext*, int>;
+
+  static int next_id = 0;
+  static base::NoDestructor<ContextIdMap> context_map;
+
+  // we need to get the original context to make sure we take the right context.
+  content::BrowserContext* original_context =
+      ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+  auto iter = context_map->find(original_context);
+  if (iter == context_map->end()) {
+    iter =
+        context_map->insert(std::make_pair(original_context, next_id++)).first;
+  }
+  return iter->second;
+}
+
 }  // namespace util
 }  // namespace extensions
diff --git a/extensions/browser/extension_util.h b/extensions/browser/extension_util.h
index 8fe10222..ae8da66 100644
--- a/extensions/browser/extension_util.h
+++ b/extensions/browser/extension_util.h
@@ -72,6 +72,10 @@
 bool CanWithholdPermissionsFromExtension(const std::string& extension_id,
                                          const Manifest::Type type,
                                          const Manifest::Location location);
+
+// Returns a unique int id for each context.
+int GetBrowserContextId(content::BrowserContext* context);
+
 }  // namespace util
 }  // namespace extensions
 
diff --git a/extensions/browser/renderer_startup_helper.cc b/extensions/browser/renderer_startup_helper.cc
index 0c05644..3f56948 100644
--- a/extensions/browser/renderer_startup_helper.cc
+++ b/extensions/browser/renderer_startup_helper.cc
@@ -139,18 +139,20 @@
         WebViewGuest::GetPartitionID(process)));
   }
 
+  BrowserContext* renderer_context = process->GetBrowserContext();
+
   // Load default policy_blocked_hosts and policy_allowed_hosts settings, part
   // of the ExtensionSettings policy.
   ExtensionMsg_UpdateDefaultPolicyHostRestrictions_Params params;
+  int context_id = util::GetBrowserContextId(renderer_context);
   params.default_policy_blocked_hosts =
-      PermissionsData::default_policy_blocked_hosts();
+      PermissionsData::GetDefaultPolicyBlockedHosts(context_id);
   params.default_policy_allowed_hosts =
-      PermissionsData::default_policy_allowed_hosts();
+      PermissionsData::GetDefaultPolicyAllowedHosts(context_id);
   process->Send(new ExtensionMsg_UpdateDefaultPolicyHostRestrictions(params));
 
   // Loaded extensions.
   std::vector<ExtensionMsg_Loaded_Params> loaded_extensions;
-  BrowserContext* renderer_context = process->GetBrowserContext();
   const ExtensionSet& extensions =
       ExtensionRegistry::Get(browser_context_)->enabled_extensions();
   for (const auto& ext : extensions) {
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index 818fb90..692156f 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -99,10 +99,7 @@
     "contexts": ["webui"],
     "matches": [
       "chrome://bluetooth-pairing/*",
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
-      "chrome://settings/*"
+      "chrome://os-settings/*"
     ]
   }],
   "bluetoothLowEnergy": {
@@ -118,10 +115,7 @@
     "contexts": ["webui"],
     "matches": [
       "chrome://bluetooth-pairing/*",
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
-      "chrome://settings/*"
+      "chrome://os-settings/*"
     ]
   }],
   "bluetoothSocket": {
@@ -269,9 +263,6 @@
     "matches": [
       "chrome://extensions/*",
       "chrome://extensions-frame/*",  // TODO(dbeam): still needed?
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
       "chrome://settings/*"
     ]
   }],
@@ -320,8 +311,6 @@
     "matches": [
       "chrome://bookmarks/*",
       "chrome://extensions/*",
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
       "chrome://os-settings/*",
       "chrome://settings/*",
       "chrome://sync-confirmation/*",
@@ -404,10 +393,7 @@
       "chrome://oobe/*",
       "chrome://internet-config-dialog/*",
       "chrome://internet-detail-dialog/*",
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
-      "chrome://settings/*"
+      "chrome://os-settings/*"
     ]
   }],
   "power": {
@@ -558,10 +544,7 @@
     "channel": "stable",
     "contexts": ["webui"],
     "matches": [
-      // TODO(maybelle): Audit and remove chrome://settings or
-      // chrome://os-settings as appropriate
-      "chrome://os-settings/*",
-      "chrome://settings/*"
+      "chrome://os-settings/*"
     ]
   }],
   "system.memory": {
diff --git a/extensions/common/extension_messages.cc b/extensions/common/extension_messages.cc
index 9f8d1b04..16dff60 100644
--- a/extensions/common/extension_messages.cc
+++ b/extensions/common/extension_messages.cc
@@ -94,6 +94,7 @@
     ExtensionMsg_Loaded_Params&& other) = default;
 
 scoped_refptr<Extension> ExtensionMsg_Loaded_Params::ConvertToExtension(
+    const int context_id,
     std::string* error) const {
   // We pass in the |id| to the create call because it will save work in the
   // normal case, and because in tests, extensions may not have paths or keys,
@@ -106,7 +107,7 @@
     permissions_data->SetPermissions(active_permissions.ToPermissionSet(),
                                      withheld_permissions.ToPermissionSet());
     if (uses_default_policy_blocked_allowed_hosts) {
-      permissions_data->SetUsesDefaultHostRestrictions();
+      permissions_data->SetUsesDefaultHostRestrictions(context_id);
     } else {
       permissions_data->SetPolicyHostRestrictions(policy_blocked_hosts,
                                                   policy_allowed_hosts);
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h
index f73c4452..ea431be 100644
--- a/extensions/common/extension_messages.h
+++ b/extensions/common/extension_messages.h
@@ -363,7 +363,11 @@
   ExtensionMsg_Loaded_Params& operator=(ExtensionMsg_Loaded_Params&& other);
 
   // Creates a new extension from the data in this object.
+  // A context_id needs to be passed because each browser context can have
+  // different values for default_policy_blocked/allowed_hosts.
+  // (see extension_util.cc#GetBrowserContextId)
   scoped_refptr<extensions::Extension> ConvertToExtension(
+      int context_id,
       std::string* error) const;
 
   // The subset of the extension manifest data we send to renderers.
diff --git a/extensions/common/extension_messages_unittest.cc b/extensions/common/extension_messages_unittest.cc
index f99d59e6..6347f78 100644
--- a/extensions/common/extension_messages_unittest.cc
+++ b/extensions/common/extension_messages_unittest.cc
@@ -87,8 +87,13 @@
   {
     // First, test just converting back to an extension.
     std::string error;
+    // TODO(devlin): Move this to a renderer-specific location in order to
+    // better enforce this restriction.
+
+    // The logic is only called in the render context that's why it's
+    // safe to pass 0 as context_id.
     scoped_refptr<const Extension> extension_out =
-        params_in.ConvertToExtension(&error);
+        params_in.ConvertToExtension(0, &error);
     EXPECT_TRUE(error.empty());
     ASSERT_TRUE(extension_out);
     CompareExtension(*extension, *extension_out);
@@ -113,7 +118,7 @@
 
     std::string error;
     scoped_refptr<const Extension> extension_out =
-        params_out.ConvertToExtension(&error);
+        params_out.ConvertToExtension(0, &error);
     EXPECT_TRUE(error.empty());
     ASSERT_TRUE(extension_out);
     CompareExtension(*extension, *extension_out);
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc
index 1c3287bb6..15585e1 100644
--- a/extensions/common/permissions/permissions_data.cc
+++ b/extensions/common/permissions/permissions_data.cc
@@ -33,6 +33,11 @@
   URLPatternSet allowed_hosts;
 };
 
+// A map between a profile (referenced by a unique id) and the default policies
+// for that profile. Since different profile have different defaults, we need to
+// have separate entries.
+using DefaultPolicyRestrictionsMap = std::map<int, DefaultPolicyRestrictions>;
+
 // Lock to access the default policy restrictions. This should never be acquired
 // before PermissionsData instance level |runtime_lock_| to prevent deadlocks.
 base::Lock& GetDefaultPolicyRestrictionsLock() {
@@ -40,16 +45,16 @@
   return *lock;
 }
 
-// Returns the default policy restrictions i.e. the URLs an extension can't
-// interact with. An extension can override these settings by declaring its own
-// list of blocked and allowed hosts using policy_blocked_hosts and
-// policy_allowed_hosts. Must be called with the default policy restriction lock
-// already acquired.
-DefaultPolicyRestrictions& GetDefaultPolicyRestrictions() {
-  static base::NoDestructor<DefaultPolicyRestrictions>
-      default_policy_restrictions;
+// Returns the DefaultPolicyRestrictions for the given context_id.
+// i.e. the URLs an extension can't interact with. An extension can override
+// these settings by declaring its own list of blocked and allowed hosts
+// using policy_blocked_hosts and policy_allowed_hosts.
+// Must be called with the default policy restriction lock already acquired.
+DefaultPolicyRestrictions& GetDefaultPolicyRestrictions(int context_id) {
+  static base::NoDestructor<DefaultPolicyRestrictionsMap>
+      default_policy_restrictions_map;
   GetDefaultPolicyRestrictionsLock().AssertAcquired();
-  return *default_policy_restrictions;
+  return (*default_policy_restrictions_map)[context_id];
 }
 
 class AutoLockOnValidThread {
@@ -153,32 +158,36 @@
 
 bool PermissionsData::UsesDefaultPolicyHostRestrictions() const {
   DCHECK(!thread_checker_ || thread_checker_->CalledOnValidThread());
-  return uses_default_policy_host_restrictions_;
+  // no locking necessary here as the value is only set once initially
+  // from the main thread and then will only be read.
+  return context_id_.has_value();
 }
 
-URLPatternSet PermissionsData::default_policy_blocked_hosts() {
+// static
+URLPatternSet PermissionsData::GetDefaultPolicyBlockedHosts(int context_id) {
   base::AutoLock lock(GetDefaultPolicyRestrictionsLock());
-  return GetDefaultPolicyRestrictions().blocked_hosts.Clone();
+  return GetDefaultPolicyRestrictions(context_id).blocked_hosts.Clone();
 }
 
-URLPatternSet PermissionsData::default_policy_allowed_hosts() {
+// static
+URLPatternSet PermissionsData::GetDefaultPolicyAllowedHosts(int context_id) {
   base::AutoLock lock(GetDefaultPolicyRestrictionsLock());
-  return GetDefaultPolicyRestrictions().allowed_hosts.Clone();
+  return GetDefaultPolicyRestrictions(context_id).allowed_hosts.Clone();
 }
 
 URLPatternSet PermissionsData::policy_blocked_hosts() const {
-  if (uses_default_policy_host_restrictions_)
-    return default_policy_blocked_hosts();
-
   base::AutoLock auto_lock(runtime_lock_);
+  if (context_id_.has_value())
+    return GetDefaultPolicyBlockedHosts(context_id_.value());
+
   return policy_blocked_hosts_unsafe_.Clone();
 }
 
 URLPatternSet PermissionsData::policy_allowed_hosts() const {
-  if (uses_default_policy_host_restrictions_)
-    return default_policy_allowed_hosts();
-
   base::AutoLock auto_lock(runtime_lock_);
+  if (context_id_.has_value())
+    return GetDefaultPolicyAllowedHosts(context_id_.value());
+
   return policy_allowed_hosts_unsafe_.Clone();
 }
 
@@ -201,22 +210,23 @@
   AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get());
   policy_blocked_hosts_unsafe_ = policy_blocked_hosts.Clone();
   policy_allowed_hosts_unsafe_ = policy_allowed_hosts.Clone();
-  uses_default_policy_host_restrictions_ = false;
+  context_id_ = base::nullopt;
 }
 
-void PermissionsData::SetUsesDefaultHostRestrictions() const {
+void PermissionsData::SetUsesDefaultHostRestrictions(int context_id) const {
   AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get());
-  uses_default_policy_host_restrictions_ = true;
+  context_id_ = context_id;
 }
 
 // static
 void PermissionsData::SetDefaultPolicyHostRestrictions(
+    int context_id,
     const URLPatternSet& default_policy_blocked_hosts,
     const URLPatternSet& default_policy_allowed_hosts) {
   base::AutoLock lock(GetDefaultPolicyRestrictionsLock());
-  GetDefaultPolicyRestrictions().blocked_hosts =
+  GetDefaultPolicyRestrictions(context_id).blocked_hosts =
       default_policy_blocked_hosts.Clone();
-  GetDefaultPolicyRestrictions().allowed_hosts =
+  GetDefaultPolicyRestrictions(context_id).allowed_hosts =
       default_policy_allowed_hosts.Clone();
 }
 
@@ -502,13 +512,12 @@
 bool PermissionsData::IsPolicyBlockedHostUnsafe(const GURL& url) const {
   // We don't use [default_]policy_[blocked|allowed]_hosts() to avoid copying
   // URLPatternSet.
-  if (uses_default_policy_host_restrictions_) {
-    base::AutoLock lock(GetDefaultPolicyRestrictionsLock());
-    return GetDefaultPolicyRestrictions().blocked_hosts.MatchesURL(url) &&
-           !GetDefaultPolicyRestrictions().allowed_hosts.MatchesURL(url);
+  runtime_lock_.AssertAcquired();
+  if (context_id_.has_value()) {
+    return GetDefaultPolicyBlockedHosts(context_id_.value()).MatchesURL(url) &&
+           !GetDefaultPolicyAllowedHosts(context_id_.value()).MatchesURL(url);
   }
 
-  runtime_lock_.AssertAcquired();
   return policy_blocked_hosts_unsafe_.MatchesURL(url) &&
          !policy_allowed_hosts_unsafe_.MatchesURL(url);
 }
diff --git a/extensions/common/permissions/permissions_data.h b/extensions/common/permissions/permissions_data.h
index 7808856..9771c67 100644
--- a/extensions/common/permissions/permissions_data.h
+++ b/extensions/common/permissions/permissions_data.h
@@ -127,12 +127,13 @@
   // which URLs extensions can interact with. A default policy can be set with
   // SetDefaultPolicyHostRestrictions. A policy specific to this extension
   // can be set with SetPolicyHostRestrictions.
-  void SetUsesDefaultHostRestrictions() const;
+  void SetUsesDefaultHostRestrictions(int context_id) const;
 
-  // Applies restrictions from enterprise policy limiting which URLs all
-  // extensions can interact with. This restriction can be overridden on a
-  // per-extension basis with SetPolicyHostRestrictions.
+  // Applies profile dependent restrictions from enterprise policy limiting
+  // which URLs all extensions can interact with. This restriction can
+  // be overridden on a per-extension basis with SetPolicyHostRestrictions.
   static void SetDefaultPolicyHostRestrictions(
+      int context_id,
       const URLPatternSet& default_policy_blocked_hosts,
       const URLPatternSet& default_policy_allowed_hosts);
 
@@ -252,14 +253,14 @@
   // This should only be used for 1. Serialization when initializing renderers
   // or 2. Called from utility methods above. For all other uses, call utility
   // methods instead (e.g. CanAccessPage()).
-  static URLPatternSet default_policy_blocked_hosts();
+  static URLPatternSet GetDefaultPolicyBlockedHosts(int context_id);
 
   // Returns list of hosts this extension may interact with regardless of
   // what is defined by policy_blocked_hosts().
   // This should only be used for 1. Serialization when initializing renderers
   // or 2. Called from utility methods above. For all other uses, call utility
   // methods instead (e.g. CanAccessPage()).
-  static URLPatternSet default_policy_allowed_hosts();
+  static URLPatternSet GetDefaultPolicyAllowedHosts(int context_id);
 
   // Returns list of hosts this extension may not interact with by policy.
   // This should only be used for 1. Serialization when initializing renderers
@@ -343,9 +344,11 @@
   // policy_allowed_hosts() accessor.
   mutable URLPatternSet policy_allowed_hosts_unsafe_;
 
-  // If the ExtensionSettings policy is not being used, or no per-extension
-  // exception to the default policy was declared for this extension.
-  mutable bool uses_default_policy_host_restrictions_ = true;
+  // An identifier for the context associated with the PermissionsData.
+  // It required in order to properly map the context to the right default
+  // policy hosts.
+  // The context_id is empty if the default policy hosts are not used.
+  mutable base::Optional<int> context_id_;
 
   mutable TabPermissionsMap tab_specific_permissions_;
 
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index f98a982..d63225b0 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -122,6 +122,11 @@
 
 namespace extensions {
 
+// Constant to define the default profile id for the renderer to 0.
+// Since each renderer is associated with a single context, we don't need
+// separate ids for the profile.
+const int kRendererProfileId = 0;
+
 namespace {
 
 static const char kOnSuspendEvent[] = "runtime.onSuspend";
@@ -960,7 +965,8 @@
     const std::vector<ExtensionMsg_Loaded_Params>& loaded_extensions) {
   for (const auto& param : loaded_extensions) {
     std::string error;
-    scoped_refptr<const Extension> extension = param.ConvertToExtension(&error);
+    scoped_refptr<const Extension> extension =
+        param.ConvertToExtension(kRendererProfileId, &error);
     if (!extension.get()) {
       NOTREACHED() << error;
       // Note: in tests |param.id| has been observed to be empty (see comment
@@ -989,7 +995,8 @@
           extension, *param.worker_activation_sequence);
     }
     if (param.uses_default_policy_blocked_allowed_hosts) {
-      extension->permissions_data()->SetUsesDefaultHostRestrictions();
+      extension->permissions_data()->SetUsesDefaultHostRestrictions(
+          kRendererProfileId);
     } else {
       extension->permissions_data()->SetPolicyHostRestrictions(
           param.policy_blocked_hosts, param.policy_allowed_hosts);
@@ -1173,7 +1180,8 @@
 void Dispatcher::OnUpdateDefaultPolicyHostRestrictions(
     const ExtensionMsg_UpdateDefaultPolicyHostRestrictions_Params& params) {
   PermissionsData::SetDefaultPolicyHostRestrictions(
-      params.default_policy_blocked_hosts, params.default_policy_allowed_hosts);
+      kRendererProfileId, params.default_policy_blocked_hosts,
+      params.default_policy_allowed_hosts);
   // Update blink host permission allowlist exceptions for all loaded
   // extensions.
   for (const std::string& extension_id :
@@ -1195,7 +1203,8 @@
     return;
 
   if (params.uses_default_policy_host_restrictions) {
-    extension->permissions_data()->SetUsesDefaultHostRestrictions();
+    extension->permissions_data()->SetUsesDefaultHostRestrictions(
+        kRendererProfileId);
   } else {
     extension->permissions_data()->SetPolicyHostRestrictions(
         params.policy_blocked_hosts, params.policy_allowed_hosts);
diff --git a/fuchsia/engine/test/web_engine_shell.cc b/fuchsia/engine/test/web_engine_shell.cc
index 8db52499..5f5b2be 100644
--- a/fuchsia/engine/test/web_engine_shell.cc
+++ b/fuchsia/engine/test/web_engine_shell.cc
@@ -7,6 +7,7 @@
 #include <fuchsia/web/cpp/fidl.h>
 #include <lib/sys/cpp/component_context.h>
 #include <lib/ui/scenic/cpp/view_token_pair.h>
+#include <iostream>
 
 #include "base/base_paths_fuchsia.h"
 #include "base/command_line.h"
@@ -26,9 +27,11 @@
 constexpr char kEnableLoggingSwitch[] = "enable-logging";
 
 void PrintUsage() {
-  LOG(INFO) << "Usage: "
+  std::cerr << "Usage: "
             << base::CommandLine::ForCurrentProcess()->GetProgram().BaseName()
-            << " [--" << kRemoteDebuggingPortSwitch << "] URL";
+            << " [--" << kRemoteDebuggingPortSwitch << "] URL." << std::endl
+            << "Setting " << kRemoteDebuggingPortSwitch << " to 0 will "
+            << "automatically choose an available port.";
 }
 
 int main(int argc, char** argv) {
@@ -63,10 +66,10 @@
     std::string port_str =
         command_line->GetSwitchValueNative(kRemoteDebuggingPortSwitch);
     int port_parsed;
-    if (!base::StringToInt(port_str, &port_parsed) || port_parsed <= 0 ||
+    if (!base::StringToInt(port_str, &port_parsed) || port_parsed < 0 ||
         port_parsed > 65535) {
       LOG(ERROR) << "Invalid value for --remote-debugging-port (must be in the "
-                    "range 1-65535).";
+                    "range 0-65535).";
       PrintUsage();
       return 1;
     }
@@ -132,6 +135,20 @@
         quit_run_loop.Run();
       });
 
+  // Log the debugging port, if debugging is requested.
+  if (remote_debugging_port) {
+    context->GetRemoteDebuggingPort(
+        [](fuchsia::web::Context_GetRemoteDebuggingPort_Result result) {
+          if (result.is_err()) {
+            LOG(ERROR) << "Remote debugging service was not opened.";
+            return;
+          }
+          // Telemetry expects this exact format of log line output to retrieve
+          // the remote debugging port.
+          LOG(INFO) << "Remote debugging port: " << result.response().port;
+        });
+  }
+
   // Navigate |frame| to |url|.
   fuchsia::web::LoadUrlParams load_params;
   load_params.set_type(fuchsia::web::LoadUrlReason::TYPED);
diff --git a/google_apis/gcm/OWNERS b/google_apis/gcm/OWNERS
index 1ef66754..ec6289f 100644
--- a/google_apis/gcm/OWNERS
+++ b/google_apis/gcm/OWNERS
@@ -1,6 +1,5 @@
 dimich@chromium.org
 peter@chromium.org
-zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
 # TEAM: platform-capabilities@chromium.org
diff --git a/gpu/command_buffer/service/external_vk_image_backing.cc b/gpu/command_buffer/service/external_vk_image_backing.cc
index b856a86..d845820 100644
--- a/gpu/command_buffer/service/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/external_vk_image_backing.cc
@@ -328,10 +328,13 @@
     if (wgpu_format.value() == WGPUTextureFormat_Undefined) {
       wgpu_format = base::nullopt;
     }
-    return base::WrapUnique(new ExternalVkImageBacking(
+
+    auto result = base::WrapUnique(new ExternalVkImageBacking(
         mailbox, resource_format, size, color_space, usage, context_state,
         vk_image, vk_device_memory, memory_size, vk_image_info.format,
         command_pool, gr_ycbcr_info, wgpu_format, {}));
+    result->SetCleared();
+    return result;
   }
 
   if (gfx::NumberOfPlanesForLinearBufferFormat(buffer_format) != 1) {
diff --git a/gpu/ipc/common/gpu_watchdog_timeout.h b/gpu/ipc/common/gpu_watchdog_timeout.h
index 258f0e8e2..2633afca 100644
--- a/gpu/ipc/common/gpu_watchdog_timeout.h
+++ b/gpu/ipc/common/gpu_watchdog_timeout.h
@@ -17,15 +17,12 @@
 #if defined(CYGPROFILE_INSTRUMENTATION)
 constexpr base::TimeDelta kGpuWatchdogTimeout =
     base::TimeDelta::FromSeconds(30);
-#elif defined(OS_WIN) || defined(OS_ANDROID)
-constexpr base::TimeDelta kGpuWatchdogTimeout =
-    base::TimeDelta::FromSeconds(15);
 #elif defined(OS_MACOSX)
 constexpr base::TimeDelta kGpuWatchdogTimeout =
     base::TimeDelta::FromSeconds(17);
 #else
 constexpr base::TimeDelta kGpuWatchdogTimeout =
-    base::TimeDelta::FromSeconds(10);
+    base::TimeDelta::FromSeconds(15);
 #endif
 
 // It usually takes longer to finish a GPU task when the system just resumes
diff --git a/gpu/ipc/service/gpu_watchdog_thread.cc b/gpu/ipc/service/gpu_watchdog_thread.cc
index 0f1326c2..35f5230c 100644
--- a/gpu/ipc/service/gpu_watchdog_thread.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread.cc
@@ -46,12 +46,10 @@
 // between V1 and V2.
 #if defined(CYGPROFILE_INSTRUMENTATION)
 const int kNewGpuTimeout = 30000;
-#elif defined(OS_WIN) || defined(OS_ANDROID)
-const int kNewGpuTimeout = 15000;
 #elif defined(OS_MACOSX)
 const int kNewGpuTimeout = 17000;
 #else
-const int kNewGpuTimeout = 10000;
+const int kNewGpuTimeout = 15000;
 #endif
 
 // Histogram parameters for GPU.WatchdogThread.V1.ExtraThreadTime and
@@ -107,7 +105,8 @@
 
 #if defined(USE_X11)
   tty_file_ = base::OpenFile(base::FilePath(kTtyFilePath), "r");
-  host_tty_ = GetActiveTTY();
+  UpdateActiveTTY();
+  host_tty_ = active_tty_;
 #endif
   base::MessageLoopCurrent::Get()->AddTaskObserver(&task_observer_);
 }
@@ -437,11 +436,13 @@
 
 #if defined(USE_X11)
   // Don't crash if we're not on the TTY of our host X11 server.
-  int active_tty = GetActiveTTY();
-  if (host_tty_ != -1 && active_tty != -1 && host_tty_ != active_tty) {
-    GpuWatchdogTimeoutHistogram(
-        GpuWatchdogTimeoutEvent::kContinueOnNonHostServerTty);
-
+  UpdateActiveTTY();
+  if (host_tty_ != -1 && active_tty_ != -1 && host_tty_ != active_tty_) {
+    // Only record for the time there is a change on TTY
+    if (last_active_tty_ != active_tty_) {
+      GpuWatchdogTimeoutHistogram(
+          GpuWatchdogTimeoutEvent::kContinueOnNonHostServerTty);
+    }
     OnAcknowledge();
     return;
   }
@@ -609,16 +610,18 @@
 #endif
 
 #if defined(USE_X11)
-int GpuWatchdogThreadImplV1::GetActiveTTY() const {
+void GpuWatchdogThreadImplV1::UpdateActiveTTY() {
+  last_active_tty_ = active_tty_;
+
+  active_tty_ = -1;
   char tty_string[8] = {0};
   if (tty_file_ && !fseek(tty_file_, 0, SEEK_SET) &&
       fread(tty_string, 1, 7, tty_file_)) {
     int tty_number;
-    size_t num_res = sscanf(tty_string, "tty%d\n", &tty_number);
-    if (num_res == 1)
-      return tty_number;
+    if (sscanf(tty_string, "tty%d\n", &tty_number) == 1) {
+      active_tty_ = tty_number;
+    }
   }
-  return -1;
 }
 #endif
 
diff --git a/gpu/ipc/service/gpu_watchdog_thread.h b/gpu/ipc/service/gpu_watchdog_thread.h
index b87f3b2..7db0ef9 100644
--- a/gpu/ipc/service/gpu_watchdog_thread.h
+++ b/gpu/ipc/service/gpu_watchdog_thread.h
@@ -208,7 +208,7 @@
 #endif
 
 #if defined(USE_X11)
-  int GetActiveTTY() const;
+  void UpdateActiveTTY();
 #endif
 
   scoped_refptr<base::SingleThreadTaskRunner> watched_task_runner_;
@@ -268,6 +268,8 @@
 #if defined(USE_X11)
   FILE* tty_file_;
   int host_tty_;
+  int active_tty_ = -1;
+  int last_active_tty_ = -1;
 #endif
 
   base::WeakPtrFactory<GpuWatchdogThreadImplV1> weak_factory_{this};
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.cc b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
index 822f3051..ddeede3 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
@@ -48,7 +48,8 @@
 #if defined(USE_X11)
   tty_file_ = base::OpenFile(
       base::FilePath(FILE_PATH_LITERAL("/sys/class/tty/tty0/active")), "r");
-  host_tty_ = GetActiveTTY();
+  UpdateActiveTTY();
+  host_tty_ = active_tty_;
 #endif
 
   Arm();
@@ -405,6 +406,10 @@
   if (foregrounded_event_)
     num_of_timeout_after_foregrounded_++;
 
+#if defined(USE_X11)
+  UpdateActiveTTY();
+#endif
+
   // Collect all needed info for gpu hang detection.
   bool disarmed = arm_disarm_counter % 2 == 0;  // even number
   bool gpu_makes_progress = arm_disarm_counter != last_arm_disarm_counter_;
@@ -733,27 +738,33 @@
 }
 
 #if defined(USE_X11)
-int GpuWatchdogThreadImplV2::GetActiveTTY() {
+void GpuWatchdogThreadImplV2::UpdateActiveTTY() {
+  last_active_tty_ = active_tty_;
+
+  active_tty_ = -1;
   char tty_string[8] = {0};
   if (tty_file_ && !fseek(tty_file_, 0, SEEK_SET) &&
       fread(tty_string, 1, 7, tty_file_)) {
     int tty_number;
-    if (sscanf(tty_string, "tty%d\n", &tty_number) == 1)
-      return tty_number;
+    if (sscanf(tty_string, "tty%d\n", &tty_number) == 1) {
+      active_tty_ = tty_number;
+    }
   }
-  return -1;
 }
 #endif
 
 bool GpuWatchdogThreadImplV2::ContinueOnNonHostX11ServerTty() {
 #if defined(USE_X11)
-  int active_tty = GetActiveTTY();
-  bool is_on_host_tty = host_tty_ == active_tty;
+  if (host_tty_ == -1 || active_tty_ == -1)
+    return false;
 
   // Don't crash if we're not on the TTY of our host X11 server.
-  if (host_tty_ != -1 && active_tty != -1 && !is_on_host_tty) {
-    GpuWatchdogTimeoutHistogram(
-        GpuWatchdogTimeoutEvent::kContinueOnNonHostServerTty);
+  if (active_tty_ != host_tty_) {
+    // Only record for the time there is a change on TTY
+    if (last_active_tty_ == active_tty_) {
+      GpuWatchdogTimeoutHistogram(
+          GpuWatchdogTimeoutEvent::kContinueOnNonHostServerTty);
+    }
     return true;
   }
 #endif
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.h b/gpu/ipc/service/gpu_watchdog_thread_v2.h
index d306282..6cc36c4 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.h
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.h
@@ -105,7 +105,7 @@
   bool WithinOneMinFromForegrounded();
 
 #if defined(USE_X11)
-  int GetActiveTTY();
+  void UpdateActiveTTY();
 #endif
   // The watchdog continues when it's not on the TTY of our host X11 server.
   bool ContinueOnNonHostX11ServerTty();
@@ -162,6 +162,8 @@
 #if defined(USE_X11)
   FILE* tty_file_ = nullptr;
   int host_tty_ = -1;
+  int active_tty_ = -1;
+  int last_active_tty_ = -1;
 #endif
 
   // The system has entered the power suspension mode.
diff --git a/infra/config/consoles/chromium.goma.migration.star b/infra/config/consoles/chromium.goma.migration.star
index 4d6798d..4304ea4 100644
--- a/infra/config/consoles/chromium.goma.migration.star
+++ b/infra/config/consoles/chromium.goma.migration.star
@@ -1038,6 +1038,33 @@
             short_name = 'x64',
         ),
         luci.console_view_entry(
+            builder = 'ci/Win x64 Builder',
+            category = 'win|week5',
+        ),
+        luci.console_view_entry(
+            builder = 'ci/GPU Win x64 Builder',
+            category = 'win|week5',
+            short_name = 'gpu',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Win x64 Builder',
+            category = 'win|week5|beta',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/GPU Win x64 Builder',
+            category = 'win|week5|beta',
+            short_name = 'gpu',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Win x64 Builder',
+            category = 'win|week5|stable',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/GPU Win x64 Builder',
+            category = 'win|week5|stable',
+            short_name = 'gpu',
+        ),
+        luci.console_view_entry(
             builder = 'ci/linux-chromeos-dbg',
             category = 'cros|week1',
             short_name = 'dbg',
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 704ac45..1879a92 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -2061,6 +2061,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -3034,6 +3035,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -3705,6 +3707,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -3747,6 +3750,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -5001,6 +5005,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -5101,6 +5106,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -5442,6 +5448,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -5524,6 +5531,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8093,6 +8101,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8138,6 +8147,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8204,6 +8214,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8226,6 +8237,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8352,6 +8364,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -8373,6 +8386,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -8394,6 +8408,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -8437,6 +8452,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8681,6 +8697,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8726,6 +8743,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8792,6 +8810,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8814,6 +8833,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -8940,6 +8960,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -8961,6 +8982,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -8982,6 +9004,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.win\""
       >
@@ -9025,6 +9048,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.gpu\""
       >
@@ -18027,7 +18051,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"jobs\":150}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"tryserver.chromium.win\""
       >
@@ -18687,7 +18711,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"jobs\":150}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"tryserver.chromium.win\""
       >
@@ -19002,7 +19026,7 @@
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
         properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"jobs\":150}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"tryserver.chromium.win\""
       >
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index c18cf6b..f0586ba 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -5473,6 +5473,33 @@
     short_name: "x64"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci/Win x64 Builder"
+    category: "win|week5"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci/GPU Win x64 Builder"
+    category: "win|week5"
+    short_name: "gpu"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Win x64 Builder"
+    category: "win|week5|beta"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/GPU Win x64 Builder"
+    category: "win|week5|beta"
+    short_name: "gpu"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Win x64 Builder"
+    category: "win|week5|stable"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/GPU Win x64 Builder"
+    category: "win|week5|stable"
+    short_name: "gpu"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci/linux-chromeos-dbg"
     category: "cros|week1"
     short_name: "dbg"
diff --git a/infra/config/versioned/milestones/m79/buckets/ci.star b/infra/config/versioned/milestones/m79/buckets/ci.star
index 3564378b0..854efcce 100644
--- a/infra/config/versioned/milestones/m79/buckets/ci.star
+++ b/infra/config/versioned/milestones/m79/buckets/ci.star
@@ -120,30 +120,29 @@
 def gpu_builder(*, name, **kwargs):
   return builder(
       name = name,
+      goma_backend = goma.backend.RBE_PROD,
       mastername = 'chromium.gpu',
       **kwargs
   )
 
 gpu_builder(
     name = 'Android Release (Nexus 5X)',
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_builder(
     name = 'GPU Linux Builder',
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_builder(
     name = 'GPU Mac Builder',
     cores = None,
-    goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
 )
 
 gpu_builder(
     name = 'GPU Win x64 Builder',
     builderless = True,
+    goma_enable_ats = True,
     os = os.WINDOWS_ANY,
 )
 
@@ -257,6 +256,8 @@
 def win_builder(*, name, os=os.WINDOWS_DEFAULT, **kwargs):
   return builder(
       name = name,
+      goma_backend = goma.backend.RBE_PROD,
+      goma_enable_ats = True,
       mastername = 'chromium.win',
       os = os,
       **kwargs
diff --git a/infra/config/versioned/milestones/m79/buckets/try.star b/infra/config/versioned/milestones/m79/buckets/try.star
index 8631abc..1ee6f14 100644
--- a/infra/config/versioned/milestones/m79/buckets/try.star
+++ b/infra/config/versioned/milestones/m79/buckets/try.star
@@ -261,6 +261,8 @@
   return try_builder(
       name = name,
       builderless = builderless,
+      goma_backend = goma.backend.RBE_PROD,
+      goma_enable_ats = True,
       mastername = 'tryserver.chromium.win',
       os = os,
       **kwargs
diff --git a/infra/config/versioned/milestones/m80/buckets/ci.star b/infra/config/versioned/milestones/m80/buckets/ci.star
index 3564378b0..854efcce 100644
--- a/infra/config/versioned/milestones/m80/buckets/ci.star
+++ b/infra/config/versioned/milestones/m80/buckets/ci.star
@@ -120,30 +120,29 @@
 def gpu_builder(*, name, **kwargs):
   return builder(
       name = name,
+      goma_backend = goma.backend.RBE_PROD,
       mastername = 'chromium.gpu',
       **kwargs
   )
 
 gpu_builder(
     name = 'Android Release (Nexus 5X)',
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_builder(
     name = 'GPU Linux Builder',
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_builder(
     name = 'GPU Mac Builder',
     cores = None,
-    goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
 )
 
 gpu_builder(
     name = 'GPU Win x64 Builder',
     builderless = True,
+    goma_enable_ats = True,
     os = os.WINDOWS_ANY,
 )
 
@@ -257,6 +256,8 @@
 def win_builder(*, name, os=os.WINDOWS_DEFAULT, **kwargs):
   return builder(
       name = name,
+      goma_backend = goma.backend.RBE_PROD,
+      goma_enable_ats = True,
       mastername = 'chromium.win',
       os = os,
       **kwargs
diff --git a/infra/config/versioned/milestones/m80/buckets/try.star b/infra/config/versioned/milestones/m80/buckets/try.star
index 798b55f1..b196cab 100644
--- a/infra/config/versioned/milestones/m80/buckets/try.star
+++ b/infra/config/versioned/milestones/m80/buckets/try.star
@@ -238,6 +238,8 @@
   return try_builder(
       name = name,
       builderless = builderless,
+      goma_backend = goma.backend.RBE_PROD,
+      goma_enable_ats = True,
       mastername = 'tryserver.chromium.win',
       os = os,
       **kwargs
diff --git a/infra/config/versioned/trunk/buckets/ci.star b/infra/config/versioned/trunk/buckets/ci.star
index 3564378b0..854efcce 100644
--- a/infra/config/versioned/trunk/buckets/ci.star
+++ b/infra/config/versioned/trunk/buckets/ci.star
@@ -120,30 +120,29 @@
 def gpu_builder(*, name, **kwargs):
   return builder(
       name = name,
+      goma_backend = goma.backend.RBE_PROD,
       mastername = 'chromium.gpu',
       **kwargs
   )
 
 gpu_builder(
     name = 'Android Release (Nexus 5X)',
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_builder(
     name = 'GPU Linux Builder',
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_builder(
     name = 'GPU Mac Builder',
     cores = None,
-    goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
 )
 
 gpu_builder(
     name = 'GPU Win x64 Builder',
     builderless = True,
+    goma_enable_ats = True,
     os = os.WINDOWS_ANY,
 )
 
@@ -257,6 +256,8 @@
 def win_builder(*, name, os=os.WINDOWS_DEFAULT, **kwargs):
   return builder(
       name = name,
+      goma_backend = goma.backend.RBE_PROD,
+      goma_enable_ats = True,
       mastername = 'chromium.win',
       os = os,
       **kwargs
diff --git a/infra/config/versioned/trunk/buckets/try.star b/infra/config/versioned/trunk/buckets/try.star
index 798b55f1..b196cab 100644
--- a/infra/config/versioned/trunk/buckets/try.star
+++ b/infra/config/versioned/trunk/buckets/try.star
@@ -238,6 +238,8 @@
   return try_builder(
       name = name,
       builderless = builderless,
+      goma_backend = goma.backend.RBE_PROD,
+      goma_enable_ats = True,
       mastername = 'tryserver.chromium.win',
       os = os,
       **kwargs
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb
index 36e053c..938add9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_af.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Ouer as 30 dae</translation>
 <translation id="5857090052475505287">Nuwe vouer</translation>
 <translation id="5857770089550859117">Wagfrase word vereis om sinkronisering te begin.</translation>
-<translation id="5860033963881614850">Af</translation>
 <translation id="5869029295770560994">OK, het dit</translation>
 <translation id="5871497086027727873">1 item is geskuif</translation>
 <translation id="5897956970858271241">Besoek gekopieerde skakel</translation>
 <translation id="5911030830365207728">Google Vertaal</translation>
 <translation id="5913600720976431809">Opsies om hierdie bladsy te vertaal</translation>
-<translation id="5916664084637901428">Aan</translation>
 <translation id="5938160824633642847">Jou toestel is amper vol. Maak spasie beskikbaar en probeer weer.</translation>
 <translation id="5948291296578561264">Hiermee kan jy foto's in jou fotobiblioteek stoor.</translation>
 <translation id="5955891643922670672">Bekyk tans vanlyn weergawe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index fa8a9f5..15c82871 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">ከ30 ቀናት በላይ የቆየ</translation>
 <translation id="5857090052475505287">አዲስ አቃፊ</translation>
 <translation id="5857770089550859117">ስምረትን ለመጀመር የይለፍ ሐረግ ያስፈልጋል።</translation>
-<translation id="5860033963881614850">አጥፋ</translation>
 <translation id="5869029295770560994">እሺ፣ ገባኝ</translation>
 <translation id="5871497086027727873">1 ንጥል ተንቀሳቅሷል</translation>
 <translation id="5897956970858271241">የተቀዳ አገናኝ ይጎብኙ</translation>
 <translation id="5911030830365207728">Google ትርጉም</translation>
 <translation id="5913600720976431809">ገጹን ለመተርጎም አማራጮች</translation>
-<translation id="5916664084637901428">በርቷል</translation>
 <translation id="5938160824633642847">ይህ መሣሪያ ሊሞላ ትንሽ ነው የቀረው። ቦታ ያስለቅቁና እንደገና ይሞክሩ።</translation>
 <translation id="5948291296578561264">ይህ ፎቶዎችን ወደ የፎቶ ቤተ-መጽሔፍትዎ እንዲያስቀምጡ ያስችልዎታል።</translation>
 <translation id="5955891643922670672">የመስመር ውጭ ስሪቱን በመመልከት ላይ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 91e9c0db..2f93238 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">مرّ عليها أكثر من 30 يومًا</translation>
 <translation id="5857090052475505287">مجلد جديد</translation>
 <translation id="5857770089550859117">عبارة المرور مطلوبة لبدء المزامنة.</translation>
-<translation id="5860033963881614850">غير مفعّل</translation>
 <translation id="5869029295770560994">حسنًا</translation>
 <translation id="5871497086027727873">تم نقل عنصر واحد</translation>
 <translation id="5897956970858271241">الانتقال إلى الرابط المنسوخ</translation>
 <translation id="5911030830365207728">‏الترجمة من Google</translation>
 <translation id="5913600720976431809">خيارات ترجمة الصفحة</translation>
-<translation id="5916664084637901428">مفعّل</translation>
 <translation id="5938160824633642847">جهازك ممتلئ تقريبًا. يمكنك إخلاء بعض المساحة وإعادة المحاولة.</translation>
 <translation id="5948291296578561264">يسمح لك ذلك بحفظ الصور في مكتبة صورك.</translation>
 <translation id="5955891643922670672">عرض النسخة بلا إنترنت</translation>
@@ -484,7 +482,7 @@
 <translation id="7464701184726199289">يمحو هذا الخيار البيانات المتزامنة من كافة الأجهزة. لن يتم حذف إعدادات موقع الويب المحفوظة وقد تعكس عادات التصفح. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="7472734401283673885">اسم الشركة</translation>
 <translation id="7481312909269577407">إلى الأمام</translation>
-<translation id="750493650310597496">لم يتم تحديد أي إشارات</translation>
+<translation id="750493650310597496">لم يتم اختيار أي إشارات</translation>
 <translation id="7514365320538308">تنزيل</translation>
 <translation id="7537586195939242955">‏عذرًا، لا يمكن أن تكون بطاقتك مثبتة على Passbook في الوقت الحالي.</translation>
 <translation id="7554791636758816595">علامة تبويب جديدة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index a001df34..56ea153 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">৩০ দিনতকৈ পুৰণি</translation>
 <translation id="5857090052475505287">নতুন ফ’ল্ডাৰ</translation>
 <translation id="5857770089550859117">ছিংক আৰম্ভ কৰিবলৈ পাছফ্রেজৰ আৱশ্যক।</translation>
-<translation id="5860033963881614850">অফ আছে</translation>
 <translation id="5869029295770560994">ঠিক আছে, বুজি পালোঁ</translation>
 <translation id="5871497086027727873">১টা বস্তু আঁতৰোৱা হ'ল</translation>
 <translation id="5897956970858271241">প্ৰতিলিপি কৰা লিংকটোলৈ যাওক</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">পৃষ্ঠাখন অনুবাদ কৰাৰ বিকল্পসমূহ</translation>
-<translation id="5916664084637901428">অন আছে</translation>
 <translation id="5938160824633642847">আপোনাৰ ডিভাইচৰ ষ্ট’ৰেজ প্ৰায় সম্পূর্ণ হৈছে। খালী ঠাই উলিয়াই আকৌ চেষ্টা কৰক।</translation>
 <translation id="5948291296578561264">ইয়াৰ জৰিয়তে আপুনি ফট’ লাইব্ৰেৰীত ফট’ ছেভ কৰিব পাৰে।</translation>
 <translation id="5955891643922670672">অফলাইন সংস্কৰণ চোৱাৰ সুবিধা</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 1670a94b..53645cb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 gündən çox</translation>
 <translation id="5857090052475505287">Yeni Qovluq</translation>
 <translation id="5857770089550859117">Sinxronizasiyanı başlamaq üçün parol söz tələb olunur.</translation>
-<translation id="5860033963881614850">Deaktiv</translation>
 <translation id="5869029295770560994">Ok, Anladım</translation>
 <translation id="5871497086027727873">1 element köçürüldü</translation>
 <translation id="5897956970858271241">Kopyalanmış Linkə Daxil Olun</translation>
 <translation id="5911030830365207728">Google Tərcümə</translation>
 <translation id="5913600720976431809">Səhifəni tərcümə etmək seçimləri</translation>
-<translation id="5916664084637901428">Aktiv</translation>
 <translation id="5938160824633642847">Cihaz doludur. Yer boşaldın və yenidən cəhd edin.</translation>
 <translation id="5948291296578561264">Bu fotoları foto kitabxanada saxlamağa icazə verir.</translation>
 <translation id="5955891643922670672">Oflayn versiyaya baxırsınız</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb
index d200294e..cc39f810 100644
--- a/ios/chrome/app/strings/resources/ios_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Даныя, старэйшыя за 30 дзён</translation>
 <translation id="5857090052475505287">Новая папка</translation>
 <translation id="5857770089550859117">Фраза-пароль для запуску сінхранізацыі.</translation>
-<translation id="5860033963881614850">Выключана</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1 элемент перамешчаны</translation>
 <translation id="5897956970858271241">Наведаць скапіраваную спасылку</translation>
 <translation id="5911030830365207728">Перакладчык Google</translation>
 <translation id="5913600720976431809">Параметры перакладу старонкі</translation>
-<translation id="5916664084637901428">Уключана</translation>
 <translation id="5938160824633642847">Сховішча прылады амаль запоўнена. Вызваліце месца і паўтарыце спробу.</translation>
 <translation id="5948291296578561264">Гэта дазваляе захоўваць фота ў бібліятэцы.</translation>
 <translation id="5955891643922670672">Паказваецца пазасеткавая версія</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 0f95bf00..ba2b6563 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">По-стари от 30 дни</translation>
 <translation id="5857090052475505287">Нова папка</translation>
 <translation id="5857770089550859117">За старт на синхронизирането е необходим пропуск.</translation>
-<translation id="5860033963881614850">Изключено</translation>
 <translation id="5869029295770560994">Добре, разбрах</translation>
 <translation id="5871497086027727873">Преместихте 1 елемент</translation>
 <translation id="5897956970858271241">Отваряне на копираната връзка</translation>
 <translation id="5911030830365207728">Google Преводач</translation>
 <translation id="5913600720976431809">Опции за превод на страницата</translation>
-<translation id="5916664084637901428">Включено</translation>
 <translation id="5938160824633642847">Хранилището на устройството ви е почти пълно. Освободете място и опитайте отново.</translation>
 <translation id="5948291296578561264">Това ви позволява да запазвате снимки във фотобиблиотеката си.</translation>
 <translation id="5955891643922670672">Гледате офлайн версията</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index 4e315357..5e85a2b1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -350,13 +350,11 @@
 <translation id="5854790677617711513">৩০ দিনের বেশি পুরনো</translation>
 <translation id="5857090052475505287">নতুন ফোল্ডার</translation>
 <translation id="5857770089550859117">সিঙ্ক শুরু করতে পাসফ্রেজ প্রয়োজন।</translation>
-<translation id="5860033963881614850">বন্ধ করুন</translation>
 <translation id="5869029295770560994">ঠিক আছে, বুঝেছি</translation>
 <translation id="5871497086027727873">১টি আইটেম সরানো হয়েছে</translation>
 <translation id="5897956970858271241">কপি করা লিঙ্কে যান</translation>
 <translation id="5911030830365207728">Google অনুবাদ</translation>
 <translation id="5913600720976431809">পৃষ্ঠা অনুবাদ করার বিকল্প</translation>
-<translation id="5916664084637901428">চালু</translation>
 <translation id="5938160824633642847">আপনার ডিভাইসে পর্যাপ্ত জায়গা নেই। জায়গা খালি করে আবার চেষ্টা করুন।</translation>
 <translation id="5948291296578561264">এর ফলে আপনি ফটো লাইব্রেরিতে ফটো সেভ করতে পারবেন।</translation>
 <translation id="5955891643922670672">অফলাইন ভার্সন দেখছেন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index 3e878f8..2358897f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Starije od 30 dana</translation>
 <translation id="5857090052475505287">Novi folder</translation>
 <translation id="5857770089550859117">Potreban je pristupni izraz za pokretanje sinhronizacije.</translation>
-<translation id="5860033963881614850">Isklj.</translation>
 <translation id="5869029295770560994">Uredu, razumijem</translation>
 <translation id="5871497086027727873">Premještena je jedna stavka</translation>
 <translation id="5897956970858271241">Posjeti kopirani link</translation>
 <translation id="5911030830365207728">Google Prevodilac</translation>
 <translation id="5913600720976431809">Opcije za prijevod stranice</translation>
-<translation id="5916664084637901428">Uključeno</translation>
 <translation id="5938160824633642847">Vaš uređaj je skoro pun. Oslobodite prostor i pokušajte ponovo.</translation>
 <translation id="5948291296578561264">Ovo vam omogućava da sačuvate fotografije u biblioteku fotografija.</translation>
 <translation id="5955891643922670672">Prikaz verzije van mreže</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index e3b92bb..8f3b16ca 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Anterior a 30 dies</translation>
 <translation id="5857090052475505287">Carpeta nova</translation>
 <translation id="5857770089550859117">Cal una frase de contrasenya per iniciar la sincronització.</translation>
-<translation id="5860033963881614850">Desactivat</translation>
 <translation id="5869029295770560994">D'acord</translation>
 <translation id="5871497086027727873">1 element desplaçat</translation>
 <translation id="5897956970858271241">Ves a l'enllaç copiat</translation>
 <translation id="5911030830365207728">Traductor de Google</translation>
 <translation id="5913600720976431809">Opcions per traduir la pàgina</translation>
-<translation id="5916664084637901428">Activat</translation>
 <translation id="5938160824633642847">El dispositiu està gairebé ple. Allibera espai i torna-ho a provar.</translation>
 <translation id="5948291296578561264">Et permet desar fotos a la biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Se n'està mostrant la versió sense connexió</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 01a7270..ffd108a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Starší než 30 dnů</translation>
 <translation id="5857090052475505287">Nová složka</translation>
 <translation id="5857770089550859117">K zahájení synchronizace je potřeba heslová fráze.</translation>
-<translation id="5860033963881614850">Vypnuto</translation>
 <translation id="5869029295770560994">Dobře, rozumím</translation>
 <translation id="5871497086027727873">Přesunuta 1 položka</translation>
 <translation id="5897956970858271241">Navštívit zkopírovaný odkaz</translation>
 <translation id="5911030830365207728">Překladač Google</translation>
 <translation id="5913600720976431809">Možnosti překladu stránky</translation>
-<translation id="5916664084637901428">Zapnuto</translation>
 <translation id="5938160824633642847">Zařízení je téměř plné. Uvolněte místo a zkuste to znovu.</translation>
 <translation id="5948291296578561264">Toto umožňuje ukládat fotky do vaší knihovny fotek.</translation>
 <translation id="5955891643922670672">Zobrazuje se offline verze</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index b188db7..ee97da41 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Ældre end 30 dage</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
 <translation id="5857770089550859117">Angiv adgangssætningen for at påbegynde synkroniseringen.</translation>
-<translation id="5860033963881614850">Fra</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1 bogmærke blev flyttet</translation>
 <translation id="5897956970858271241">Gå til kopieret link</translation>
 <translation id="5911030830365207728">Google Oversæt</translation>
 <translation id="5913600720976431809">Valgmuligheder for oversættelse af side</translation>
-<translation id="5916664084637901428">Til</translation>
 <translation id="5938160824633642847">Din enhed er ved at løbe tør for plads. Frigør plads, og prøv igen.</translation>
 <translation id="5948291296578561264">Dermed kan du gemme fotos i din fotosamling.</translation>
 <translation id="5955891643922670672">Viser offlineversion</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index cd89069..88f4d3c64 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Älter als 30 Tage</translation>
 <translation id="5857090052475505287">Neuer Ordner</translation>
 <translation id="5857770089550859117">Geben Sie Ihre Passphrase ein, um die Synchronisierung zu starten.</translation>
-<translation id="5860033963881614850">Aus</translation>
 <translation id="5869029295770560994">Ok</translation>
 <translation id="5871497086027727873">1 Lesezeichen verschoben</translation>
 <translation id="5897956970858271241">Kopierten Link aufrufen</translation>
 <translation id="5911030830365207728">Google Übersetzer</translation>
 <translation id="5913600720976431809">Optionen zum Übersetzen der Seite</translation>
-<translation id="5916664084637901428">An</translation>
 <translation id="5938160824633642847">Der Speicher Ihres Geräts ist fast voll. Geben Sie Speicherplatz frei und versuchen Sie es dann noch einmal.</translation>
 <translation id="5948291296578561264">Dadurch können Sie Fotos in der Fotogalerie speichern.</translation>
 <translation id="5955891643922670672">Offlineversion wird angezeigt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 6bc1b74a..f2b2bb80 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Παλαιότερο από 30 ημέρες</translation>
 <translation id="5857090052475505287">Νέος φάκελος</translation>
 <translation id="5857770089550859117">Απαιτείται φράση πρόσβασης για έναρξη του συγχρονισμού.</translation>
-<translation id="5860033963881614850">Απενεργοποιημένη</translation>
 <translation id="5869029295770560994">OK, το κατάλαβα!</translation>
 <translation id="5871497086027727873">Μετακινήθηκε 1 στοιχείο</translation>
 <translation id="5897956970858271241">Μετάβαση στον αντιγραμμένο σύνδεσμο</translation>
 <translation id="5911030830365207728">Μετάφραση Google</translation>
 <translation id="5913600720976431809">Επιλογές για τη Μετάφραση σελίδας</translation>
-<translation id="5916664084637901428">Ενεργό</translation>
 <translation id="5938160824633642847">Ο αποθηκευτικός χώρος της συσκευής σας έχει σχεδόν γεμίσει. Ελευθερώστε χώρο και προσπαθήστε ξανά.</translation>
 <translation id="5948291296578561264">Σας επιτρέπει να αποθηκεύετε φωτογραφίες στη βιβλιοθήκη φωτογραφιών σας.</translation>
 <translation id="5955891643922670672">Προβολή έκδοσης εκτός σύνδεσης</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 660a90f..e06ce32 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Older than 30 days</translation>
 <translation id="5857090052475505287">New Folder</translation>
 <translation id="5857770089550859117">Passphrase required to start sync.</translation>
-<translation id="5860033963881614850">Off</translation>
 <translation id="5869029295770560994">OK, got it</translation>
 <translation id="5871497086027727873">1 item moved</translation>
 <translation id="5897956970858271241">Visit copied link</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Options to translate the page</translation>
-<translation id="5916664084637901428">On</translation>
 <translation id="5938160824633642847">Your device is almost full. Free up space and try again.</translation>
 <translation id="5948291296578561264">This lets you save photos to your photo library.</translation>
 <translation id="5955891643922670672">Viewing Offline Version</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 ea97454..f4ec972 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Hace más de 30 días</translation>
 <translation id="5857090052475505287">Nueva carpeta</translation>
 <translation id="5857770089550859117">Se requiere la frase de contraseña para comenzar la sincronización.</translation>
-<translation id="5860033963881614850">Desactivado</translation>
 <translation id="5869029295770560994">Entendido</translation>
 <translation id="5871497086027727873">1 artículo movido</translation>
 <translation id="5897956970858271241">Visitar el vínculo copiado</translation>
 <translation id="5911030830365207728">Google Traductor</translation>
 <translation id="5913600720976431809">Opciones para traducir la página</translation>
-<translation id="5916664084637901428">Activado</translation>
 <translation id="5938160824633642847">El dispositivo está casi lleno. Libera espacio y vuelve a intentarlo.</translation>
 <translation id="5948291296578561264">Esta acción te permite guardar fotos en tu biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Vista de la versión sin conexión</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index e0cf67d0..534fa47 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Más de 30 días</translation>
 <translation id="5857090052475505287">Nueva carpeta</translation>
 <translation id="5857770089550859117">Se requiere una frase de contraseña para iniciar la sincronización.</translation>
-<translation id="5860033963881614850">Desactivado</translation>
 <translation id="5869029295770560994">Entendido</translation>
 <translation id="5871497086027727873">1 elemento eliminado</translation>
 <translation id="5897956970858271241">Ir al enlace copiado</translation>
 <translation id="5911030830365207728">Traductor de Google</translation>
 <translation id="5913600720976431809">Opciones para traducir la página</translation>
-<translation id="5916664084637901428">Activado</translation>
 <translation id="5938160824633642847">Tu dispositivo está casi lleno. Libera espacio y vuelve a intentarlo.</translation>
 <translation id="5948291296578561264">Esta acción te permite guardar fotos en tu biblioteca.</translation>
 <translation id="5955891643922670672">Viendo versión sin conexión</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 417866c..b1ef824 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Vanemad kui 30 päeva</translation>
 <translation id="5857090052475505287">Uus kaust</translation>
 <translation id="5857770089550859117">Sünkroonimise alustamiseks on vaja parooli.</translation>
-<translation id="5860033963881614850">Väljas</translation>
 <translation id="5869029295770560994">Selge, sain aru</translation>
 <translation id="5871497086027727873">1 üksus on teisaldatud</translation>
 <translation id="5897956970858271241">Ava kopeeritud link</translation>
 <translation id="5911030830365207728">Google'i tõlge</translation>
 <translation id="5913600720976431809">Lehe tõlkimise võimalused</translation>
-<translation id="5916664084637901428">Sees</translation>
 <translation id="5938160824633642847">Seade on peaaegu täis. Vabastage ruumi ja proovige uuesti.</translation>
 <translation id="5948291296578561264">See võimaldab teil salvestada fotod fotokogusse.</translation>
 <translation id="5955891643922670672">Kuvatakse võrguühenduseta versioon</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index ed630be8..e0782e6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Duela 30 egunetik gorakoak</translation>
 <translation id="5857090052475505287">Karpeta berria</translation>
 <translation id="5857770089550859117">Pasaesaldia behar da sinkronizatzen hasteko.</translation>
-<translation id="5860033963881614850">Desaktibatuta</translation>
 <translation id="5869029295770560994">Ados, ulertu dut</translation>
 <translation id="5871497086027727873">Elementu bat mugitu da</translation>
 <translation id="5897956970858271241">Joan kopiatu duzun estekara</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Orria itzultzeko aukerak</translation>
-<translation id="5916664084637901428">Aktibatuta</translation>
 <translation id="5938160824633642847">Gailua ia beteta dago. Egin toki pixka bat eta saiatu berriro.</translation>
 <translation id="5948291296578561264">Honekin, argazkien liburutegian gorde ahalko dituzu argazkiak.</translation>
 <translation id="5955891643922670672">Konexiorik gabeko bertsioa da hau</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 23bb6536..7365ad0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">قدیمی‌تر از ۳۰ روز</translation>
 <translation id="5857090052475505287">پوشهٔ جدید</translation>
 <translation id="5857770089550859117">برای شروع همگام‌سازی به عبارت عبور نیاز است.</translation>
-<translation id="5860033963881614850">خاموش</translation>
 <translation id="5869029295770560994">بله متوجه شدم</translation>
 <translation id="5871497086027727873">۱ مورد منتقل شد</translation>
 <translation id="5897956970858271241">به پیوندی که کپی کرده‌اید بروید</translation>
 <translation id="5911030830365207728">‏‫مترجم Google‬</translation>
 <translation id="5913600720976431809">گزینه‌های ترجمه صفحه</translation>
-<translation id="5916664084637901428">روشن</translation>
 <translation id="5938160824633642847">دستگاهتان تقریباً پر است. فضا آزاد کنید و دوباره امتحان کنید.</translation>
 <translation id="5948291296578561264">با این کار می‌توانید عکس‌ها را در کتابخانه عکستان ذخیره کنید.</translation>
 <translation id="5955891643922670672">درحال مشاهده نسخه آفلاین</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 30ba3bd..eec8ab8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Yli 30 päivää vanhat</translation>
 <translation id="5857090052475505287">Uusi kansio</translation>
 <translation id="5857770089550859117">Synkronointi edellyttää tunnuslausetta.</translation>
-<translation id="5860033963881614850">Pois päältä</translation>
 <translation id="5869029295770560994">Selvä</translation>
 <translation id="5871497086027727873">1 kohde siirretty</translation>
 <translation id="5897956970858271241">Avaa kopioitu linkki</translation>
 <translation id="5911030830365207728">Google Kääntäjä</translation>
 <translation id="5913600720976431809">Sivun käännösvalinnat</translation>
-<translation id="5916664084637901428">Päällä</translation>
 <translation id="5938160824633642847">Laite on lähes täynnä. Vapauta tilaa ja yritä uudelleen.</translation>
 <translation id="5948291296578561264">Tämän avulla voit tallentaa kuvia kuvakirjastoon.</translation>
 <translation id="5955891643922670672">Näytetään offline-versio</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 3232be9..970aac9d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Mas matagal sa 30 araw</translation>
 <translation id="5857090052475505287">Bagong Folder</translation>
 <translation id="5857770089550859117">Kinakailangan ang passphrase upang masimulan ang pag-sync.</translation>
-<translation id="5860033963881614850">Naka-off</translation>
 <translation id="5869029295770560994">OK, Nakuha Ko</translation>
 <translation id="5871497086027727873">1 item ang inilipat</translation>
 <translation id="5897956970858271241">Bisitahin ang Kinopyang Link</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Mga opsyon para Isalin ang page</translation>
-<translation id="5916664084637901428">Naka-on</translation>
 <translation id="5938160824633642847">Malapit nang mapuno ang iyong device. Magbakante ng espasyo at subukang muli.</translation>
 <translation id="5948291296578561264">Binibigyang-daan ka nito na mag-save ng mga larawan sa iyong library ng larawan.</translation>
 <translation id="5955891643922670672">Tinitingnan ang Offline na Bersyon</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index 6f9063e..69223e01 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Datant de plus de 30 jours</translation>
 <translation id="5857090052475505287">Nouveau dossier</translation>
 <translation id="5857770089550859117">Une phrase de passe est requise pour commencer la synchronisation.</translation>
-<translation id="5860033963881614850">Désactivé</translation>
 <translation id="5869029295770560994">OK, j'ai compris</translation>
 <translation id="5871497086027727873">1 élément déplacé</translation>
 <translation id="5897956970858271241">Consulter le lien copié</translation>
 <translation id="5911030830365207728">Google Traduction</translation>
 <translation id="5913600720976431809">Options pour traduire la page</translation>
-<translation id="5916664084637901428">Activé</translation>
 <translation id="5938160824633642847">Votre appareil est presque plein. Libérez de l'espace et réessayez.</translation>
 <translation id="5948291296578561264">Cela vous permet d'enregistrer vos photos dans votre bibliothèque de photos.</translation>
 <translation id="5955891643922670672">Affichage de la version hors ligne</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 494f4e2..e94a002 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Datant de plus de 30 jours</translation>
 <translation id="5857090052475505287">Nouveau dossier</translation>
 <translation id="5857770089550859117">Veuillez saisir la phrase secrète pour lancer la synchronisation.</translation>
-<translation id="5860033963881614850">Désactivé</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1 élément déplacé.</translation>
 <translation id="5897956970858271241">Consulter le lien copié</translation>
 <translation id="5911030830365207728">Google Traduction</translation>
 <translation id="5913600720976431809">Options de traduction de la page</translation>
-<translation id="5916664084637901428">Activé</translation>
 <translation id="5938160824633642847">Votre appareil est presque saturé. Libérez de l'espace et réessayez.</translation>
 <translation id="5948291296578561264">Cela vous permet d'enregistrer des photos dans votre photothèque.</translation>
 <translation id="5955891643922670672">Affichage de la version hors connexion</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 02ae583..2c6b315 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Con máis de 30 días</translation>
 <translation id="5857090052475505287">Novo cartafol</translation>
 <translation id="5857770089550859117">Introduce a frase de acceso para iniciar a sincronización.</translation>
-<translation id="5860033963881614850">Non</translation>
 <translation id="5869029295770560994">De acordo</translation>
 <translation id="5871497086027727873">Moveuse un elemento</translation>
 <translation id="5897956970858271241">Ir á ligazón que copiaches</translation>
 <translation id="5911030830365207728">Tradutor de Google</translation>
 <translation id="5913600720976431809">Opcións para traducir a páxina</translation>
-<translation id="5916664084637901428">Si</translation>
 <translation id="5938160824633642847">O teu dispositivo case está cheo. Libera espazo e téntao de novo.</translation>
 <translation id="5948291296578561264">Permíteche gardar fotos na túa fototeca.</translation>
 <translation id="5955891643922670672">Visualizando a versión sen conexión</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 8375d35c..3a9efec 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 દિવસ કરતા જૂનો</translation>
 <translation id="5857090052475505287">નવું ફોલ્ડર</translation>
 <translation id="5857770089550859117">સમન્વયનને પ્રારંભ કરવા માટે પાસફ્રેઝ આવશ્યક.</translation>
-<translation id="5860033963881614850">બંધ</translation>
 <translation id="5869029295770560994">બરાબર, સમજાઈ ગયું</translation>
 <translation id="5871497086027727873">1 આઇટમ ખસેડી</translation>
 <translation id="5897956970858271241">કૉપિ કરેલી લિંકની મુલાકાત લો</translation>
 <translation id="5911030830365207728">Google અનુવાદ</translation>
 <translation id="5913600720976431809">પેજનો અનુવાદ કરવા માટેના વિકલ્પો</translation>
-<translation id="5916664084637901428">ચાલુ</translation>
 <translation id="5938160824633642847">તમારું ઉપકરણ લગભગ ભરાઈ ગયું છે. સ્પેસ બનાવો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="5948291296578561264">આ તમને તમારી ફોટો લાઇબ્રેરીમાં ફોટો સાચવવા દે છે.</translation>
 <translation id="5955891643922670672">ઑફલાઇન વર્ઝન જોઈ રહ્યા છે</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index b952461..1566b205 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 दिनों से ज़्यादा पुराना</translation>
 <translation id="5857090052475505287">नया फ़ोल्डर</translation>
 <translation id="5857770089550859117">सिंक शुरू करने के लिए पासफ़्रेज़ ज़रूरी है</translation>
-<translation id="5860033963881614850">बंद</translation>
 <translation id="5869029295770560994">ठीक है, समझ लिया</translation>
 <translation id="5871497086027727873">1 आइटम ले जाया गया</translation>
 <translation id="5897956970858271241">कॉपी किए गए लिंक पर जाएं</translation>
 <translation id="5911030830365207728">Google अनुवाद</translation>
 <translation id="5913600720976431809">पेज का अनुवाद करने के विकल्प</translation>
-<translation id="5916664084637901428">चालू</translation>
 <translation id="5938160824633642847">आपके डिवाइस की करीब पूरी जगह भर गई है. जगह खाली करके दोबारा आज़माएं.</translation>
 <translation id="5948291296578561264">इससे फ़ोटो आपकी फ़ोटो लाइब्रेरी में सेव कर लिए जाते हैं.</translation>
 <translation id="5955891643922670672">ऑफ़लाइन वर्शन देख रहे हैं</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index a0f73bb..71a23cf7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Starije od 30 dana</translation>
 <translation id="5857090052475505287">Nova mapa</translation>
 <translation id="5857770089550859117">Za pokretanje sinkronizacije potrebna je zaporka.</translation>
-<translation id="5860033963881614850">Isključeno</translation>
 <translation id="5869029295770560994">U redu, shvaćam</translation>
 <translation id="5871497086027727873">Premještena je 1 stavka</translation>
 <translation id="5897956970858271241">Otvori kopiranu vezu</translation>
 <translation id="5911030830365207728">Google prevoditelj</translation>
 <translation id="5913600720976431809">Opcije prevođenja stranice</translation>
-<translation id="5916664084637901428">Uključi</translation>
 <translation id="5938160824633642847">Uređaj je gotovo pun. Oslobodite prostor i pokušajte ponovo.</translation>
 <translation id="5948291296578561264">To vam omogućuje da spremite fotografije u zbirku fotografija.</translation>
 <translation id="5955891643922670672">Prikaz offline verzije</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 16699bc..cbc20f9a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 napnál régebbi</translation>
 <translation id="5857090052475505287">Új mappa</translation>
 <translation id="5857770089550859117">A szinkronizálás megkezdéséhez összetett jelszó megadása szükséges.</translation>
-<translation id="5860033963881614850">Kikapcsolva</translation>
 <translation id="5869029295770560994">Rendben, értem</translation>
 <translation id="5871497086027727873">1 elem áthelyezve</translation>
 <translation id="5897956970858271241">Másolt link megnyitása</translation>
 <translation id="5911030830365207728">Google Fordító</translation>
 <translation id="5913600720976431809">Az oldal lefordításával kapcsolatos beállítások</translation>
-<translation id="5916664084637901428">Be</translation>
 <translation id="5938160824633642847">Az eszköz tárhelye majdnem megtelt. Szabadítson fel helyet, és próbálja újra.</translation>
 <translation id="5948291296578561264">Segítségével fotókat menthet a fotótárba.</translation>
 <translation id="5955891643922670672">Offline verzió</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index b55450d..84a9782 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 օր և ավելի</translation>
 <translation id="5857090052475505287">Նոր պանակ</translation>
 <translation id="5857770089550859117">Համաժամացումը սկսելու համար անհրաժեշտ է անցաբառ:</translation>
-<translation id="5860033963881614850">Անջատ.</translation>
 <translation id="5869029295770560994">Լավ, հասկացա</translation>
 <translation id="5871497086027727873">Տեղափոխվել է 1 տարր</translation>
 <translation id="5897956970858271241">Անցնել պատճենված հղումով</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Էջը թարգմանելու տարբերակներ</translation>
-<translation id="5916664084637901428">Միացնել</translation>
 <translation id="5938160824633642847">Ձեր սարքի հիշողությունը գրեթե լիքն է։ Ազատեք տարածք և նորից փորձեք:</translation>
 <translation id="5948291296578561264">Սրա շնորհիվ կկարողանաք լուսանկարներ պահել ձեր ֆոտոդարանում:</translation>
 <translation id="5955891643922670672">Անցանց տարբերակի դիտում</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index a2ad202..a37fb27 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Lebih dari 30 hari</translation>
 <translation id="5857090052475505287">Folder Baru</translation>
 <translation id="5857770089550859117">Perlu frasa sandi untuk memulai sinkronisasi.</translation>
-<translation id="5860033963881614850">Nonaktif</translation>
 <translation id="5869029295770560994">Oke, Mengerti</translation>
 <translation id="5871497086027727873">1 item dipindah</translation>
 <translation id="5897956970858271241">Buka Link yang Disalin</translation>
 <translation id="5911030830365207728">Google Terjemahan</translation>
 <translation id="5913600720976431809">Opsi untuk Menerjemahkan halaman</translation>
-<translation id="5916664084637901428">Aktif</translation>
 <translation id="5938160824633642847">Perangkat Anda hampir penuh. Kosongkan ruang penyimpanan dan coba lagi.</translation>
 <translation id="5948291296578561264">Tindakan ini memungkinkan Anda menyimpan foto ke koleksi foto.</translation>
 <translation id="5955891643922670672">Melihat Versi Offline</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index 1e39b7f..ab9412fc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Eldra en 30 dagar</translation>
 <translation id="5857090052475505287">Ný mappa</translation>
 <translation id="5857770089550859117">Aðgangsorð er nauðsynlegt til að hefja samstillingu.</translation>
-<translation id="5860033963881614850">Slökkt</translation>
 <translation id="5869029295770560994">Ég skil</translation>
 <translation id="5871497086027727873">Eitt atriði fært</translation>
 <translation id="5897956970858271241">Opna afritaðan tengil</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Valkostir fyrir þýðingu þessarar síðu</translation>
-<translation id="5916664084637901428">Kveikt</translation>
 <translation id="5938160824633642847">Tækið er næstum því fullt. Losaðu um pláss og reyndu aftur.</translation>
 <translation id="5948291296578561264">Þetta gerir þér kleift að vista myndir í myndasafninu þínu.</translation>
 <translation id="5955891643922670672">Skoðar útgáfu án nettengingar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 01906f62..b7833a3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Oltre 30 giorni fa</translation>
 <translation id="5857090052475505287">Nuova cartella</translation>
 <translation id="5857770089550859117">Per avviare la sincronizzazione è obbligatoria la passphrase.</translation>
-<translation id="5860033963881614850">OFF</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1 elemento spostato</translation>
 <translation id="5897956970858271241">Visita il link copiato</translation>
 <translation id="5911030830365207728">Google Traduttore</translation>
 <translation id="5913600720976431809">Opzioni per tradurre la pagina</translation>
-<translation id="5916664084637901428">On</translation>
 <translation id="5938160824633642847">Il dispositivo è quasi pieno. Libera spazio e riprova.</translation>
 <translation id="5948291296578561264">In questo modo puoi salvare le foto nella raccolta di foto.</translation>
 <translation id="5955891643922670672">È visualizzata la versione offline</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 07279c0..fc3c2056 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">לפני יותר מ-30 ימים</translation>
 <translation id="5857090052475505287">תיקייה חדשה</translation>
 <translation id="5857770089550859117">יש להזין את ביטוי הסיסמה כדי להפעיל את הסינכרון.</translation>
-<translation id="5860033963881614850">כבוי</translation>
 <translation id="5869029295770560994">בסדר, הבנתי</translation>
 <translation id="5871497086027727873">פריט אחד הועבר</translation>
 <translation id="5897956970858271241">מעבר לקישור שהועתק</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">אפשרויות לתרגום הדף</translation>
-<translation id="5916664084637901428">פועל</translation>
 <translation id="5938160824633642847">המכשיר שלך כמעט מלא. צריך לפנות מקום ולנסות שוב.</translation>
 <translation id="5948291296578561264">מאפשר לך לשמור תמונות בספריית התמונות.</translation>
 <translation id="5955891643922670672">מציג גרסה לא מקוונת</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index ebdb0693..a48474c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 日以上経過</translation>
 <translation id="5857090052475505287">新しいフォルダ</translation>
 <translation id="5857770089550859117">同期を開始するにはパスフレーズが必要です。</translation>
-<translation id="5860033963881614850">オフ</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1件の項目を移動しました</translation>
 <translation id="5897956970858271241">コピーしたリンクにアクセス</translation>
 <translation id="5911030830365207728">Google 翻訳</translation>
 <translation id="5913600720976431809">ページ翻訳のオプション</translation>
-<translation id="5916664084637901428">オン</translation>
 <translation id="5938160824633642847">デバイスの空き容量が少なくなっています。空き容量を増やしてからもう一度お試しください。</translation>
 <translation id="5948291296578561264">フォト ライブラリに写真を保存します。</translation>
 <translation id="5955891643922670672">オフライン版を表示しています</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index 0f851e44..917e38b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 დღეზე ძველი</translation>
 <translation id="5857090052475505287">ახალი საქაღალდე</translation>
 <translation id="5857770089550859117">სინქრონიზაციის დასაწყებად, საჭიროა საიდუმლო ფრაზის მითითება.</translation>
-<translation id="5860033963881614850">გამორთვა</translation>
 <translation id="5869029295770560994">კარგი, გასაგებია</translation>
 <translation id="5871497086027727873">1 ელემენტი გადატანილია</translation>
 <translation id="5897956970858271241">კოპირებულ ბმულზე გადასვლა</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">გვერდის თარგმნის ვარიანტები</translation>
-<translation id="5916664084637901428">ჩართვა</translation>
 <translation id="5938160824633642847">თქვენი მოწყობილობის მეხსიერება თითქმის სავსეა. გაათავისუფლეთ სივრცე და ცადეთ ხელახლა.</translation>
 <translation id="5948291296578561264">ეს აპი საშუალებას გაძლევთ, შეინახოთ ფოტოები თქვენს ფოტოების ბიბლიოთეკაში.</translation>
 <translation id="5955891643922670672">თქვენ ხაზგარეშე ვერსიას ათვალიერებთ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index 218b58d0..345dcfa1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 күннен асқан</translation>
 <translation id="5857090052475505287">Жаңа қалта</translation>
 <translation id="5857770089550859117">Синхрондауды бастау үшін құпия фраза қажет.</translation>
-<translation id="5860033963881614850">Өшірулі</translation>
 <translation id="5869029295770560994">Жарайды, түсінікті</translation>
 <translation id="5871497086027727873">1 элемент көшірілді</translation>
 <translation id="5897956970858271241">Көшірілген сілтеме бойынша өту</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Бетті аудару опциялары</translation>
-<translation id="5916664084637901428">Қосу</translation>
 <translation id="5938160824633642847">Құрылғыңыздың жады толуға жақын. Оны босатып, әрекетті қайталаңыз.</translation>
 <translation id="5948291296578561264">Бұл суреттерді жинаққа сақтауға мүмкіндік береді.</translation>
 <translation id="5955891643922670672">Офлайн нұсқаны көру</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index 29085f5..e7b933f7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">ចាស់ជាង 30 ថ្ងៃ</translation>
 <translation id="5857090052475505287">ថតឯកសារថ្មី</translation>
 <translation id="5857770089550859117">តម្រូវឲ្យមានឃ្លាសម្ងាត់ដើម្បីចាប់ផ្តើមសមកាលកម្ម។</translation>
-<translation id="5860033963881614850">បិទ</translation>
 <translation id="5869029295770560994">យល់ព្រម ខ្ញុំយល់ហើយ</translation>
 <translation id="5871497086027727873">ធាតុ 1 ត្រូវបានផ្លាស់ទី</translation>
 <translation id="5897956970858271241">ចូល​ទៅកាន់តំណ​ដែល​បានចម្លង</translation>
 <translation id="5911030830365207728">កម្មវិធីបកប្រែ Google</translation>
 <translation id="5913600720976431809">ជម្រើស​សម្រាប់​បកប្រែទំព័រ</translation>
-<translation id="5916664084637901428">បើក</translation>
 <translation id="5938160824633642847">ឧបករណ៍​របស់អ្នក​ជិត​ពេញ​ហើយ។ សូម​បង្កើន​ទំហំ​ផ្ទុក​ រួច​ព្យាយាម​ម្តងទៀត។</translation>
 <translation id="5948291296578561264">វា​អនុញ្ញាត​ឱ្យអ្នក​រក្សាទុក​រូបថត​ទៅក្នុងបណ្ណាល័យរូបថត​របស់អ្នក។</translation>
 <translation id="5955891643922670672">កំពុង​មើល​កំណែ​គ្មាន​អ៊ីនធឺណិត</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 523f0153..12dd84c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 ದಿನಗಳಿಗಿಂತ ಹಳೆಯದು</translation>
 <translation id="5857090052475505287">ಹೊಸ ಫೋಲ್ಡರ್</translation>
 <translation id="5857770089550859117">ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು ಪಾಸ್‌ಫ್ರೇಸ್ ಅಗತ್ಯವಿದೆ.</translation>
-<translation id="5860033963881614850">ಆಫ್</translation>
 <translation id="5869029295770560994">ಸರಿ, ಅರ್ಥವಾಯಿತು</translation>
 <translation id="5871497086027727873">1 ಐಟಂ ಸರಿಸಲಾಗಿದೆ</translation>
 <translation id="5897956970858271241">ನಕಲಿಸಿದ ಲಿಂಕ್‌ಗೆ ಭೇಟಿ ನೀಡಿ</translation>
 <translation id="5911030830365207728">Google ಅನುವಾದ</translation>
 <translation id="5913600720976431809">ಪುಟವನ್ನು ಅನುವಾದಿಸಲು ಆಯ್ಕೆಗಳು</translation>
-<translation id="5916664084637901428">ಆನ್‌</translation>
 <translation id="5938160824633642847">ನಿಮ್ಮ ಸಾಧನ ಬಹುತೇಕ ಭರ್ತಿಯಾಗಿದೆ. ಸ್ಥಳಾವಕಾಶ ಮುಕ್ತಗೊಳಿಸಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5948291296578561264">ನಿಮ್ಮ ಫೋಟೋ ಲೈಬ್ರರಿಗೆ ಫೋಟೋಗಳನ್ನು ಉಳಿಸಲು ಇದು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation>
 <translation id="5955891643922670672">ಆಫ್‌ಲೈನ್ ಆವೃತ್ತಿ ಅನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index ea4bd30..482a698 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30일 이상 전</translation>
 <translation id="5857090052475505287">새 폴더</translation>
 <translation id="5857770089550859117">동기화를 시작하려면 암호가 필요합니다.</translation>
-<translation id="5860033963881614850">사용 안함</translation>
 <translation id="5869029295770560994">확인</translation>
 <translation id="5871497086027727873">1개 항목 이동함</translation>
 <translation id="5897956970858271241">복사한 링크 방문</translation>
 <translation id="5911030830365207728">Google 번역</translation>
 <translation id="5913600720976431809">페이지 번역 옵션</translation>
-<translation id="5916664084637901428">사용</translation>
 <translation id="5938160824633642847">기기의 저장용량이 거의 가득 찼습니다. 여유 공간을 확보한 후 다시 시도해 보세요.</translation>
 <translation id="5948291296578561264">이렇게 하면 사진 라이브러리에 사진을 저장할 수 있습니다.</translation>
 <translation id="5955891643922670672">오프라인 버전 보는 중</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index c6918aa..64a8105d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 күндөн мурунку</translation>
 <translation id="5857090052475505287">Жаңы папка</translation>
 <translation id="5857770089550859117">Шайкештирип баштоо үчүн жашыруун сөз айкашы керек.</translation>
-<translation id="5860033963881614850">Өчүк</translation>
 <translation id="5869029295770560994">Жарайт, түшүндүм</translation>
 <translation id="5871497086027727873">1 нерсе жылдырылды</translation>
 <translation id="5897956970858271241">Көчүрүлгөн шилтеме менен өтүңүз</translation>
 <translation id="5911030830365207728">Google Котормо</translation>
 <translation id="5913600720976431809">Бул баракты которуу параметрлери</translation>
-<translation id="5916664084637901428">Күйүк</translation>
 <translation id="5938160824633642847">Түзмөгүңүздө орун аз калды. Орун бошотуп, кайра аракет кылыңыз.</translation>
 <translation id="5948291296578561264">Ушуну менен сүрөттөрдү галереяңызга сактоого мүмкүндүк берилет.</translation>
 <translation id="5955891643922670672">Оффлайн версиясын көрүп жатасыз</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index e6a1876..4643952 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">ເກົ່າກວ່າ 30 ມື້</translation>
 <translation id="5857090052475505287">ໂຟລເດີ​ໃຫມ່</translation>
 <translation id="5857770089550859117">ຈຳເປັນຕ້ອງມີວະລີຜ່ານເພື່ອເລີ່ມການຊິ້ງຂໍ້ມູນ.</translation>
-<translation id="5860033963881614850">ປິດ</translation>
 <translation id="5869029295770560994">ຕົກລົງ, ເຂົ້າໃຈແລ້ວ​</translation>
 <translation id="5871497086027727873">1 ລາຍ​ການ​ຖືກ​ຍ້າຍ​ໄປ​ແລ້ວ</translation>
 <translation id="5897956970858271241">ເຂົ້າເບິ່ງລິ້ງທີ່ສຳເນົາ</translation>
 <translation id="5911030830365207728">Google ແປພາສາ</translation>
 <translation id="5913600720976431809">ຕົວເລືອກໃນການແປໜ້າ</translation>
-<translation id="5916664084637901428">ເປີດ</translation>
 <translation id="5938160824633642847">ອຸປະກອນຂອງທ່ານເກືອບເຕັມແລ້ວ. ກະລຸນາຂະຫຍາຍພື້ນທີ່ຫວ່າງ ແລະ ລອງອີກຄັ້ງ.</translation>
 <translation id="5948291296578561264">ນີ້ອະນຸຍາດໃຫ້ທ່ານບັນທຶກຮູບຖ່າຍໄວ້ໃນຫ້ອງສະໝຸດຮູບ.</translation>
 <translation id="5955891643922670672">ກຳລັງເບິ່ງເວີຊັນອອບລາຍ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index ef178952..b9b5d0f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Senesni nei 30 dienų</translation>
 <translation id="5857090052475505287">Naujas aplankas</translation>
 <translation id="5857770089550859117">Norint pradėti sinchronizuoti reikalinga slaptafrazė.</translation>
-<translation id="5860033963881614850">Išjungta</translation>
 <translation id="5869029295770560994">Gerai, supratau</translation>
 <translation id="5871497086027727873">Perkelta elementų: 1</translation>
 <translation id="5897956970858271241">Apsilankyti nukopijuotos nuorodos adresu</translation>
 <translation id="5911030830365207728">„Google“ vertėjas</translation>
 <translation id="5913600720976431809">Puslapio vertimo parinktys</translation>
-<translation id="5916664084637901428">Įjungta</translation>
 <translation id="5938160824633642847">Jūsų įrenginys beveik pilnas. Atlaisvinkite vietos ir bandykite dar kartą.</translation>
 <translation id="5948291296578561264">Taip galėsite išsaugoti nuotraukas nuotraukų bibliotekoje.</translation>
 <translation id="5955891643922670672">Peržiūros neprisijungus versija</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 4d75dce..168e3f3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Vecāki par 30 dienām</translation>
 <translation id="5857090052475505287">Jauna mape</translation>
 <translation id="5857770089550859117">Lai sāktu sinhronizāciju, ievadiet ieejas frāzi.</translation>
-<translation id="5860033963881614850">Izsl.</translation>
 <translation id="5869029295770560994">Labi, sapratu</translation>
 <translation id="5871497086027727873">Tika pārvietots 1 vienums.</translation>
 <translation id="5897956970858271241">Apmeklēt kopēto saiti</translation>
 <translation id="5911030830365207728">Google tulkotājs</translation>
 <translation id="5913600720976431809">Šīs lapas tulkošanas opcijas</translation>
-<translation id="5916664084637901428">Iesl.</translation>
 <translation id="5938160824633642847">Ierīcē nepietiek vietas. Atbrīvojiet vietu un mēģiniet vēlreiz.</translation>
 <translation id="5948291296578561264">Šādi varat saglabāt fotoattēlus savā fotoattēlu bibliotēkā.</translation>
 <translation id="5955891643922670672">Tiek skatīta bezsaistes versija</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
index 54cb6cd..8af6dfe3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Постари од 30 дена</translation>
 <translation id="5857090052475505287">Нова папка</translation>
 <translation id="5857770089550859117">Потребна е лозинка за да започне синхронизацијата.</translation>
-<translation id="5860033963881614850">Исклучено</translation>
 <translation id="5869029295770560994">Добро, сфатив</translation>
 <translation id="5871497086027727873">1 ставка е преместена</translation>
 <translation id="5897956970858271241">Посетете го копираниот линк</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Опции за „Преведи ја страницата“</translation>
-<translation id="5916664084637901428">Вклучено</translation>
 <translation id="5938160824633642847">Уредот е речиси полн. Ослободете простор и обидете се повторно.</translation>
 <translation id="5948291296578561264">Ова ви овозможува да ги зачувате фотографиите во збирката со фотографии.</translation>
 <translation id="5955891643922670672">Се прегледува офлајн верзија</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 1a20ad0..ec5a8cad 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 ദിവസത്തിൽ കൂടുതൽ പഴക്കമുള്ളത്</translation>
 <translation id="5857090052475505287">പുതിയ ഫോള്‍ഡര്‍</translation>
 <translation id="5857770089550859117">സമന്വയിപ്പിക്കൽ തുടങ്ങുന്നതിന്, പാസ്‌ഫ്രെയ്‌സ് ആവശ്യമാണ്.</translation>
-<translation id="5860033963881614850">ഓഫാക്കുക</translation>
 <translation id="5869029295770560994">മനസ്സിലായി</translation>
 <translation id="5871497086027727873">ഒരിനം നീക്കി</translation>
 <translation id="5897956970858271241">പകർത്തിയ ലിങ്ക് സന്ദർശിക്കുക</translation>
 <translation id="5911030830365207728">Google വിവർത്തനം</translation>
 <translation id="5913600720976431809">പേജ് വിവർത്തനം ചെയ്യാനുള്ള ഓപ്ഷനുകൾ</translation>
-<translation id="5916664084637901428">ഓൺ ചെയ്യുക</translation>
 <translation id="5938160824633642847">ഉപകരണത്തിന്റെ സ്‌റ്റോറേജ് ഏകദേശം നിറഞ്ഞു. കുറച്ച് ഇടം സൃഷ്ടിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5948291296578561264">നിങ്ങളുടെ ഫോട്ടോ ലൈബ്രറിയിലേക്ക് ഫോട്ടോകൾ സംരക്ഷിക്കാൻ അനുവദിക്കുന്നു.</translation>
 <translation id="5955891643922670672">ഓഫ്‌ലൈൻ പതിപ്പ് കാണുന്നു</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 2bd280f8..68a02c26 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -348,13 +348,11 @@
 <translation id="5854790677617711513">30 өдрөөс илүү</translation>
 <translation id="5857090052475505287">Шинэ хавтас</translation>
 <translation id="5857770089550859117">Синкийг эхлүүлэхийн тулд нэвтрэх үг оруулах шаардлагатай.</translation>
-<translation id="5860033963881614850">Идэвхгүй байна</translation>
 <translation id="5869029295770560994">OK, ойлголоо.</translation>
 <translation id="5871497086027727873">1 зүйлийг зөөсөн байна</translation>
 <translation id="5897956970858271241">Хуулсан холбоосонд зочлох</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Хуудсыг орчуулах сонголтууд</translation>
-<translation id="5916664084637901428">Асаах</translation>
 <translation id="5938160824633642847">Таны төхөөрөмж бараг дүүрсэн байна. Зай гаргаад дахин оролдоно уу.</translation>
 <translation id="5948291296578561264">Энэ нь танд зургийг зургийн сандаа хадгалах боломжийг олгодог.</translation>
 <translation id="5955891643922670672">Офлайн хувилбарыг харж байна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 953927c..526930f7b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -350,13 +350,11 @@
 <translation id="5854790677617711513">30 दिवसांपेक्षा जुना</translation>
 <translation id="5857090052475505287">नवीन फोल्डर</translation>
 <translation id="5857770089550859117">सिंक सुरू करण्यासाठी सांकेतिक पासफ्रेझ आवश्यक आहे.</translation>
-<translation id="5860033963881614850">बंद</translation>
 <translation id="5869029295770560994">ठीक आहे, समजले</translation>
 <translation id="5871497086027727873">1 आयटम हलविला</translation>
 <translation id="5897956970858271241">कॉपी केलेल्या लिंकला भेट द्या</translation>
 <translation id="5911030830365207728">Google भाषांतर</translation>
 <translation id="5913600720976431809">पेज भाषांतरित करण्यासाठी पर्याय</translation>
-<translation id="5916664084637901428">चालू</translation>
 <translation id="5938160824633642847">तुमचे डिव्हाइस जवळजवळ भरले आहे. जागा मोकळी करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5948291296578561264">हे तुम्हाला तुमच्या फोटो लायब्ररीवर फोटो सेव्ह करू देते.</translation>
 <translation id="5955891643922670672">ऑफलाइन आवृत्ती पाहत आहे</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index f140987..41628fe6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Lebih lama daripada 30 hari</translation>
 <translation id="5857090052475505287">Folder Baharu</translation>
 <translation id="5857770089550859117">Ungkapan laluan diperlukan untuk memulakan penyegerakan.</translation>
-<translation id="5860033963881614850">Dimatikan</translation>
 <translation id="5869029295770560994">OK, Faham</translation>
 <translation id="5871497086027727873">1 item dialihkan</translation>
 <translation id="5897956970858271241">Lawati Pautan Disalin</translation>
 <translation id="5911030830365207728">Google Terjemah</translation>
 <translation id="5913600720976431809">Pilihan untuk Menterjemah halaman</translation>
-<translation id="5916664084637901428">Hidupkan</translation>
 <translation id="5938160824633642847">Peranti anda hampir penuh. Kosongkan ruang dan cuba lagi.</translation>
 <translation id="5948291296578561264">Tindakan ini membolehkan anda menyimpan foto pada pustaka foto anda.</translation>
 <translation id="5955891643922670672">Melihat Versi Luar Talian</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index 2898390..1383139b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -348,13 +348,11 @@
 <translation id="5854790677617711513">ရက် ၃၀ ထက် ပိုဟောင်းသော</translation>
 <translation id="5857090052475505287">အကန့်အသစ်</translation>
 <translation id="5857770089550859117">စတင်၍ စင့်ခ်ပြုလုပ်ရန် စကားဝှက်လိုအပ်ပါသည်။</translation>
-<translation id="5860033963881614850">ပိတ်ထား</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">အကြောင်းအရာ 1 ခုပြောင်းရွှေ့ပြီးပါပြီ</translation>
 <translation id="5897956970858271241">မိတ္တူကူးထားသော လင့်ခ်သို့ ဝင်ကြည့်ပါ</translation>
 <translation id="5911030830365207728">Google ဘာသာပြန်</translation>
 <translation id="5913600720976431809">စာမျက်နှာကို 'ဘာသာပြန်ရန်' ရွေးချယ်မှုများ</translation>
-<translation id="5916664084637901428">ဖွင့်ရန်</translation>
 <translation id="5938160824633642847">သင်၏ စက်ပစ္စည်းနေရာ ပြည့်ပါတော့မည်။ နေရာလွတ်လုပ်ပြီး ထပ်စမ်းကြည့်ပါ။</translation>
 <translation id="5948291296578561264">၎င်းသည်ဓာတ်ပုံများအား သင်၏ဓာတ်ပုံဒစ်ဂျစ်တိုက်သို့ သိမ်းဆည်းခွင့်ပေးပါသည်။</translation>
 <translation id="5955891643922670672">အောဖ့်လိုင်းဗားရှင်းဖြင့် ကြည့်ရှုနေသည်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
index b8bcbf3..0737380f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">३० दिनभन्दा पुरानो</translation>
 <translation id="5857090052475505287">नयाँ फोल्डर</translation>
 <translation id="5857770089550859117">सिंक सुरु गर्न पासफ्रेज आवश्यक छ।</translation>
-<translation id="5860033963881614850">बन्द</translation>
 <translation id="5869029295770560994">ठिक छ, बुझेँ</translation>
 <translation id="5871497086027727873">1 वस्तु सारियो</translation>
 <translation id="5897956970858271241">प्रतिलिपि गरिएको लिंकमा जानुहोस्</translation>
 <translation id="5911030830365207728">Google अनुवादक</translation>
 <translation id="5913600720976431809">यो पृष्ठ अनुवाद गर्ने विकल्पहरू</translation>
-<translation id="5916664084637901428">खुल्ला</translation>
 <translation id="5938160824633642847">तपाईंको यन्त्रको भण्डारण स्थान लगभग भरिएको छ। भण्डारण स्थान खाली गरी फेरि प्रयास गर्नुहोस्।</translation>
 <translation id="5948291296578561264">यो अनुप्रयोगले तपाईंलाई आफ्नो तस्बिरको लाइब्रेरीमा तस्बिरहरू सुरक्षित गर्न दिन्छ।</translation>
 <translation id="5955891643922670672">अफलाइन संस्करण हेरिँदै</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 2dca022..eb95919 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Ouder dan 30 dagen</translation>
 <translation id="5857090052475505287">Nieuwe map</translation>
 <translation id="5857770089550859117">Wachtwoordzin vereist om de synchronisatie te starten.</translation>
-<translation id="5860033963881614850">Uit</translation>
 <translation id="5869029295770560994">OK, begrepen</translation>
 <translation id="5871497086027727873">1 item verplaatst</translation>
 <translation id="5897956970858271241">Gekopieerde link bezoeken</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Opties om de pagina te vertalen</translation>
-<translation id="5916664084637901428">Aan</translation>
 <translation id="5938160824633642847">Je apparaat is bijna vol. Maak ruimte vrij en probeer het opnieuw.</translation>
 <translation id="5948291296578561264">Hiermee kun je foto's opslaan in je fotobibliotheek.</translation>
 <translation id="5955891643922670672">Offline versie bekijken</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index e85fe35..51a7db5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Eldre enn 30 dager</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
 <translation id="5857770089550859117">Det kreves en passordfrase for å starte synkroniseringen.</translation>
-<translation id="5860033963881614850">Av</translation>
 <translation id="5869029295770560994">Greit</translation>
 <translation id="5871497086027727873">1 element er flyttet</translation>
 <translation id="5897956970858271241">Besøk den kopierte linken</translation>
 <translation id="5911030830365207728">Google Oversetter</translation>
 <translation id="5913600720976431809">Alternativer for oversetting av siden</translation>
-<translation id="5916664084637901428">På</translation>
 <translation id="5938160824633642847">Enheten er nesten full. Frigjør plass og prøv på nytt.</translation>
 <translation id="5948291296578561264">Da kan du lagre bilder i bildebiblioteket ditt.</translation>
 <translation id="5955891643922670672">Du ser en versjon uten nett</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index c91f8ad..d097a40 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -347,13 +347,11 @@
 <translation id="5854790677617711513">30 ଦିନରୁ ଅଧିକ ପୁରୁଣା</translation>
 <translation id="5857090052475505287">ନୂତନ ଫୋଲ୍ଡର୍</translation>
 <translation id="5857770089550859117">ସିଙ୍କ୍‌ କରିବାକୁ ପାସ୍‌ଫ୍ରେଜ୍ ଆବଶ୍ୟକ।</translation>
-<translation id="5860033963881614850">ବନ୍ଦ ଅଛି</translation>
 <translation id="5869029295770560994">ଠିକ୍ ଅଛି, ବୁଝିଗଲି</translation>
 <translation id="5871497086027727873">1ଟି ଆଇଟମ୍‌ ଘୁଞ୍ଚାଇ ଦିଆଗଲା</translation>
 <translation id="5897956970858271241">କପି କରାଯାଇଥିବା ଲିଙ୍କ୍‌କୁ ଯାଆନ୍ତୁ</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">ପୃଷ୍ଠା ଅନୁବାଦ କରିବା ପାଇଁ ବିକଳ୍ପଗୁଡ଼ିକ</translation>
-<translation id="5916664084637901428">ଚାଲୁ</translation>
 <translation id="5938160824633642847">ଆପଣଙ୍କର ଡିଭାଇସ୍ ପ୍ରାୟ ପୂର୍ଣ୍ଣ ହୋଇଆସିଲାଣି। ଜାଗା ଖାଲି କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="5948291296578561264">ଏହା ଆପଣଙ୍କର ଫଟୋ ଲାଇବ୍ରେରୀରେ ଫଟୋଗୁଡ଼ିକ ସେଭ୍‍ କରିବାକୁ ଦେଇଥାଏ।</translation>
 <translation id="5955891643922670672">ଅଫ୍‌ଲାଇନ୍ ସଂସ୍କରଣ ଦେଖୁଛନ୍ତି</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
index 21624d6..cbcba0a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 ਦਿਨਾਂ ਤੋਂ ਜ਼ਿਆਦਾ ਪੁਰਾਣਾ</translation>
 <translation id="5857090052475505287">ਨਵਾਂ ਫੋਲਡਰ</translation>
 <translation id="5857770089550859117">ਸਮਕਾਲੀਕਰਨ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਪਾਸਫਰੇਜ਼ ਦੀ ਲੋੜ ਹੈ।</translation>
-<translation id="5860033963881614850">ਬੰਦ ਕਰੋ</translation>
 <translation id="5869029295770560994">ਠੀਕ, ਸਮਝ ਲਿਆ</translation>
 <translation id="5871497086027727873">1 ਆਈਟਮ ਮੂਵ ਕੀਤੀ ਗਈ</translation>
 <translation id="5897956970858271241">ਕਾਪੀ ਕੀਤੇ ਲਿੰਕ 'ਤੇ ਜਾਓ</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਦੇ ਵਿਕਲਪ</translation>
-<translation id="5916664084637901428">ਤੇ</translation>
 <translation id="5938160824633642847">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਸਟੋਰੇਜ ਲਗਭਗ ਭਰੀ ਹੋਈ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="5948291296578561264">ਇਹ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਫ਼ੋਟੋ ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ ਫ਼ੋਟੋਆਂ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਦਿੰਦਾ ਹੈ।</translation>
 <translation id="5955891643922670672">ਆਫ਼ਲਾਈਨ ਵਰਜਨ ਦੇਖਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 7295787a..d73a003 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Sprzed ponad 30 dni</translation>
 <translation id="5857090052475505287">Nowy folder</translation>
 <translation id="5857770089550859117">Wpisz hasło, by rozpocząć synchronizację.</translation>
-<translation id="5860033963881614850">Wyłączone</translation>
 <translation id="5869029295770560994">Rozumiem</translation>
 <translation id="5871497086027727873">Przeniosłeś 1 element</translation>
 <translation id="5897956970858271241">Otwórz skopiowany link</translation>
 <translation id="5911030830365207728">Tłumacz Google</translation>
 <translation id="5913600720976431809">Opcje tłumaczenia strony</translation>
-<translation id="5916664084637901428">Włączone</translation>
 <translation id="5938160824633642847">Na urządzeniu brakuje wolnego miejsca. Zwolnij miejsce i spróbuj ponownie.</translation>
 <translation id="5948291296578561264">Umożliwia zapisywanie zdjęć w ich bibliotece.</translation>
 <translation id="5955891643922670672">Wyświetlam wersję offline</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 7fd52631..20ca441 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Com mais de 30 dias</translation>
 <translation id="5857090052475505287">Nova pasta</translation>
 <translation id="5857770089550859117">É necessário ter uma senha longa para iniciar a sincronização.</translation>
-<translation id="5860033963881614850">Desativado</translation>
 <translation id="5869029295770560994">Ok, entendi</translation>
 <translation id="5871497086027727873">1 item movido</translation>
 <translation id="5897956970858271241">Visitar link copiado</translation>
 <translation id="5911030830365207728">Google Tradutor</translation>
 <translation id="5913600720976431809">Opções para traduzir a página</translation>
-<translation id="5916664084637901428">Ativado</translation>
 <translation id="5938160824633642847">Seu dispositivo está quase cheio. Libere espaço e tente novamente.</translation>
 <translation id="5948291296578561264">Isso permite que você salve fotos na sua biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Exibindo a versão off-line</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 09f0082..2a6962b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Com mais de 30 dias</translation>
 <translation id="5857090052475505287">Nova pasta</translation>
 <translation id="5857770089550859117">A frase de acesso é necessária para iniciar a sincronização.</translation>
-<translation id="5860033963881614850">Desativado</translation>
 <translation id="5869029295770560994">OK, compreendi</translation>
 <translation id="5871497086027727873">1 item movido</translation>
 <translation id="5897956970858271241">Aceder ao link copiado</translation>
 <translation id="5911030830365207728">Google Tradutor</translation>
 <translation id="5913600720976431809">Opções de tradução da página</translation>
-<translation id="5916664084637901428">Ativado</translation>
 <translation id="5938160824633642847">O dispositivo está quase cheio. Liberte espaço e tente novamente.</translation>
 <translation id="5948291296578561264">Isto permite-lhe guardar fotos na sua biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Ver a versão offline</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 062a965..24454e1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Mai vechi de 30 de zile</translation>
 <translation id="5857090052475505287">Dosar nou</translation>
 <translation id="5857770089550859117">Pentru a începe sincronizarea este necesară expresia de acces.</translation>
-<translation id="5860033963881614850">Dezactivat</translation>
 <translation id="5869029295770560994">OK, am înțeles</translation>
 <translation id="5871497086027727873">Un element mutat</translation>
 <translation id="5897956970858271241">Accesează linkul copiat</translation>
 <translation id="5911030830365207728">Google Traducere</translation>
 <translation id="5913600720976431809">Opțiuni pentru a traduce pagina</translation>
-<translation id="5916664084637901428">Activat</translation>
 <translation id="5938160824633642847">Dispozitivul este aproape plin. Eliberează spațiu și încearcă din nou.</translation>
 <translation id="5948291296578561264">Astfel, poți să salvezi fotografiile în fototecă.</translation>
 <translation id="5955891643922670672">Se afișează versiunea offline</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 8d988a9..06f69ad 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Сохраненные более 30 дней назад</translation>
 <translation id="5857090052475505287">Новая папка</translation>
 <translation id="5857770089550859117">Чтобы начать синхронизацию, введите кодовую фразу.</translation>
-<translation id="5860033963881614850">ВЫКЛ</translation>
 <translation id="5869029295770560994">ОК</translation>
 <translation id="5871497086027727873">Перемещено закладок: 1</translation>
 <translation id="5897956970858271241">Открыть скопированную ссылку</translation>
 <translation id="5911030830365207728">Google Переводчик</translation>
 <translation id="5913600720976431809">Параметры перевода страницы</translation>
-<translation id="5916664084637901428">ВКЛ</translation>
 <translation id="5938160824633642847">Освободите место на устройстве и повторите попытку.</translation>
 <translation id="5948291296578561264">Это позволяет вам сохранять фотографии в галерее.</translation>
 <translation id="5955891643922670672">Просматривается в офлайн-режиме</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index 6daf766..3b97c83 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">දින 30කට වඩා පැරණි</translation>
 <translation id="5857090052475505287">නව ෆෝල්ඩරය</translation>
 <translation id="5857770089550859117">සමමුහුර්ත කිරීම ආරම්භ කිරීමට අවශ්‍ය මුරවැකිකඩ</translation>
-<translation id="5860033963881614850">අක්‍රීය</translation>
 <translation id="5869029295770560994">හරි, තේරුණා</translation>
 <translation id="5871497086027727873">අයිතම 1 ක් ගෙනයන ලදි</translation>
 <translation id="5897956970858271241">පිටපත් කළ සබැඳියට පැමිණෙන්න</translation>
 <translation id="5911030830365207728">Google පරිවර්තනය</translation>
 <translation id="5913600720976431809">පිටුව පරිවර්තන කිරීමට විවෘත කරන්න</translation>
-<translation id="5916664084637901428">සක්‍රීය</translation>
 <translation id="5938160824633642847">ඔබේ උපාංගය මුළුමනින්ම පිරී ඇත. ඉඩ නිදහස් කර නැවත උත්සාහ කරන්න.</translation>
 <translation id="5948291296578561264">මෙය ඔබට ඔබේ ඡායාරූප පුස්තකාලයට ඡායාරූප සුරැකීමට ඉඩ සලසයි.</translation>
 <translation id="5955891643922670672">නොබැඳි අනුවාදය බලමින්</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index afe14e6..a2a2436 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Staršie ako 30 dní</translation>
 <translation id="5857090052475505287">Nový priečinok</translation>
 <translation id="5857770089550859117">Spustenie synchronizácie vyžaduje prístupovú frázu.</translation>
-<translation id="5860033963881614850">Vypnuté</translation>
 <translation id="5869029295770560994">Dobre</translation>
 <translation id="5871497086027727873">1 položka bola presunutá</translation>
 <translation id="5897956970858271241">Navštíviť skopírovaný odkaz</translation>
 <translation id="5911030830365207728">Prekladač Google</translation>
 <translation id="5913600720976431809">Možnosti prekladu stránky</translation>
-<translation id="5916664084637901428">Zapnuté</translation>
 <translation id="5938160824633642847">Vaše zariadenie je takmer plné. Uvoľnite miesto a skúste to znova.</translation>
 <translation id="5948291296578561264">Umožňuje ukladať fotky do knižnice fotiek.</translation>
 <translation id="5955891643922670672">Zobrazuje sa offline verzia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index eda578d5..45770c54 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Starejše od 30 dni</translation>
 <translation id="5857090052475505287">Nova mapa</translation>
 <translation id="5857770089550859117">Passphrase required to start sync.</translation>
-<translation id="5860033963881614850">Izklopljeno</translation>
 <translation id="5869029295770560994">V redu, razumem</translation>
 <translation id="5871497086027727873">1 element premaknjen</translation>
 <translation id="5897956970858271241">Obisk povezave, ki ste jo kopirali</translation>
 <translation id="5911030830365207728">Google Prevajalnik</translation>
 <translation id="5913600720976431809">Možnosti za prevod strani</translation>
-<translation id="5916664084637901428">Vklopljeno</translation>
 <translation id="5938160824633642847">Shramba naprave je skoraj polna. Sprostite prostor in poskusite znova.</translation>
 <translation id="5948291296578561264">S tem je mogoče shranjevati fotografije v knjižnico fotografij.</translation>
 <translation id="5955891643922670672">Ogled različice brez povezave</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index be43765..64c5b4e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Më të vjetra se 30 ditë</translation>
 <translation id="5857090052475505287">Skedar i ri</translation>
 <translation id="5857770089550859117">Kërkohet shprehja e kalimit për të nisur sinkronizimin.</translation>
-<translation id="5860033963881614850">Çaktivizuar</translation>
 <translation id="5869029295770560994">Në rregull, kuptova</translation>
 <translation id="5871497086027727873">1 element u lëviz</translation>
 <translation id="5897956970858271241">Vizito lidhjen e kopjuar</translation>
 <translation id="5911030830365207728">Përkthe me Google</translation>
 <translation id="5913600720976431809">Opsionet për përkthimin e faqes</translation>
-<translation id="5916664084637901428">Aktiv</translation>
 <translation id="5938160824633642847">Pajisja jote është thuajse plot. Liro hapësirë dhe provo përsëri.</translation>
 <translation id="5948291296578561264">Kjo të lejon të ruash fotografi në bibliotekën tënde të fotografive.</translation>
 <translation id="5955891643922670672">Po shikon versionin jashtë linje</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 3fd0383..4902685 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Старије од 30 дана</translation>
 <translation id="5857090052475505287">Нови директоријум</translation>
 <translation id="5857770089550859117">За почетак синхронизације потребна је приступна фраза.</translation>
-<translation id="5860033963881614850">Искључено</translation>
 <translation id="5869029295770560994">Важи</translation>
 <translation id="5871497086027727873">1 ставка је премештена</translation>
 <translation id="5897956970858271241">Иди на копирани линк</translation>
 <translation id="5911030830365207728">Google преводилац</translation>
 <translation id="5913600720976431809">Опције за превод странице</translation>
-<translation id="5916664084637901428">Укључено</translation>
 <translation id="5938160824633642847">Уређај је скоро пун. Ослободите простор и пробајте поново.</translation>
 <translation id="5948291296578561264">Ово вам омогућава да чувате слике у фототеци.</translation>
 <translation id="5955891643922670672">Прегледате офлајн верзију</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 592a8d1..9b73ee0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Äldre än 30 dagar</translation>
 <translation id="5857090052475505287">Ny mapp</translation>
 <translation id="5857770089550859117">Lösenfras krävs för att starta synkroniseringen.</translation>
-<translation id="5860033963881614850">Av</translation>
 <translation id="5869029295770560994">Ok, jag förstår</translation>
 <translation id="5871497086027727873">1 objekt flyttades</translation>
 <translation id="5897956970858271241">Besök kopierad länk</translation>
 <translation id="5911030830365207728">Google Översätt</translation>
 <translation id="5913600720976431809">Alternativ för att översätta sidan</translation>
-<translation id="5916664084637901428">På</translation>
 <translation id="5938160824633642847">Det finns nästan ingen plats kvar på enheten. Frigör utrymme och försök igen.</translation>
 <translation id="5948291296578561264">Gör så att du kan spara foton i fotobiblioteket.</translation>
 <translation id="5955891643922670672">Offlineversionen visas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 92ac711..0acf891 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Iliyohifadhiwa kwa zaidi ya siku 30</translation>
 <translation id="5857090052475505287">Folda Mpya</translation>
 <translation id="5857770089550859117">Kauli ya siri inahitajika ili kuanza kusawazisha.</translation>
-<translation id="5860033963881614850">Kimezimwa</translation>
 <translation id="5869029295770560994">Sawa, Nimeelewa</translation>
 <translation id="5871497086027727873">Kipengee 1 kimesogezwa</translation>
 <translation id="5897956970858271241">Fungua Kiungo Ulichonakili</translation>
 <translation id="5911030830365207728">Google Tafsiri</translation>
 <translation id="5913600720976431809">Chaguo za Kutafsiri ukurasa</translation>
-<translation id="5916664084637901428">Imewashwa</translation>
 <translation id="5938160824633642847">Nafasi ya kifaa chako inakaribia kujaa. Tafadhali futa baadhi vipengee ili upate nafasi kisha ujaribu tena.</translation>
 <translation id="5948291296578561264">Hatua hii inakuruhusu uhifadhi picha kwenye maktaba ya picha.</translation>
 <translation id="5955891643922670672">Unasoma Toleo la Nje ya Mtandao</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index 4e7a2d9..c2013cc0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 நாட்களுக்கு முந்தையவை</translation>
 <translation id="5857090052475505287">புதிய கோப்புறை</translation>
 <translation id="5857770089550859117">ஒத்திசைவைத் தொடங்க, கடவுச்சொற்றொடர் தேவை.</translation>
-<translation id="5860033963881614850">ஆஃப்</translation>
 <translation id="5869029295770560994">சரி, புரிந்தது</translation>
 <translation id="5871497086027727873">1 உருப்படி நகர்த்தப்பட்டது</translation>
 <translation id="5897956970858271241">நகலெடுத்த இணைப்பிற்குச் செல்</translation>
 <translation id="5911030830365207728">Google மொழியாக்கம்</translation>
 <translation id="5913600720976431809">பக்கத்தை மொழிபெயர்ப்பதற்கான விருப்பத்தேர்வுகள்</translation>
-<translation id="5916664084637901428">இயக்கு</translation>
 <translation id="5938160824633642847">உங்கள் சாதனச் சேமிப்பகம் கிட்டத்தட்ட நிரம்பிவிட்டது. இடத்தைக் காலியாக்கி, மீண்டும் முயலவும்.</translation>
 <translation id="5948291296578561264">உங்கள் பட நூலகத்தில் படங்களைச் சேமிக்க இது அனுமதிக்கும்.</translation>
 <translation id="5955891643922670672">ஆஃப்லைன் பதிப்பைப் பார்க்கிறீர்கள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index d356024..7068804e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 రోజుల కన్నా పాతవి</translation>
 <translation id="5857090052475505287">క్రొత్త ఫోల్డర్</translation>
 <translation id="5857770089550859117">సింక్‌ను ప్రారంభించడానికి రహస్య పదబంధం అవసరం.</translation>
-<translation id="5860033963881614850">ఆఫ్ అయ్యింది</translation>
 <translation id="5869029295770560994">సరే, అర్థమైంది</translation>
 <translation id="5871497086027727873">1 అంశం తరలించబడింది</translation>
 <translation id="5897956970858271241">కాపీ చేసిన లింక్‌ను సందర్శించండి</translation>
 <translation id="5911030830365207728">Google అనువాదం</translation>
 <translation id="5913600720976431809">పేజీ అనువాద ఎంపికలు</translation>
-<translation id="5916664084637901428">ఆన్ చేయి</translation>
 <translation id="5938160824633642847">మీ పరికరం దాదాపు నిండింది. స్థలాన్ని ఖాళీ చేసిన తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5948291296578561264">ఇది మీ ఫోటో లైబ్రరీకి ఫోటోలను సేవ్ చేయడానికి మీకు వీలు కల్పిస్తుంది.</translation>
 <translation id="5955891643922670672">ఆఫ్‌లైన్ వెర్షన్‌ను చూస్తున్నారు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 0cd09284..a1df8242 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">เกิน 30 วัน</translation>
 <translation id="5857090052475505287">โฟลเดอร์ใหม่</translation>
 <translation id="5857770089550859117">ต้องระบุรหัสผ่านเพื่อเริ่มการซิงค์</translation>
-<translation id="5860033963881614850">ปิด</translation>
 <translation id="5869029295770560994">รับทราบ</translation>
 <translation id="5871497086027727873">ย้ายแล้ว 1 รายการ</translation>
 <translation id="5897956970858271241">ไปที่ลิงก์ที่คัดลอก</translation>
 <translation id="5911030830365207728">Google แปลภาษา</translation>
 <translation id="5913600720976431809">ตัวเลือกในการแปลหน้า</translation>
-<translation id="5916664084637901428">เปิด</translation>
 <translation id="5938160824633642847">พื้นที่ในอุปกรณ์เกือบเต็มแล้ว เพิ่มพื้นที่ว่างแล้วลองอีกครั้ง</translation>
 <translation id="5948291296578561264">ช่วยให้คุณบันทึกรูปภาพในคลังภาพได้</translation>
 <translation id="5955891643922670672">การดูเวอร์ชันออฟไลน์</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index d631092..1af5993 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 günden daha eski</translation>
 <translation id="5857090052475505287">Yeni Klasör</translation>
 <translation id="5857770089550859117">Senkronizasyonu başlatmak için parola gerekiyor.</translation>
-<translation id="5860033963881614850">Kapalı</translation>
 <translation id="5869029295770560994">Tamam, Anladım</translation>
 <translation id="5871497086027727873">1 öğe taşındı</translation>
 <translation id="5897956970858271241">Kopyalanan Bağlantıyı Ziyaret Et</translation>
 <translation id="5911030830365207728">Google Çeviri</translation>
 <translation id="5913600720976431809">Sayfayı çevirme seçenekleri</translation>
-<translation id="5916664084637901428">Açık</translation>
 <translation id="5938160824633642847">Cihazınızın depolama alanı dolmak üzere. Yer boşaltın ve tekrar deneyin.</translation>
 <translation id="5948291296578561264">Böylece, fotoğrafları fotoğraf kitaplığınıza kaydedebilirsiniz.</translation>
 <translation id="5955891643922670672">Çevrimdışı Sürüm Gösteriliyor</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 2f4c4264..3ebebe4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Понад 30 днів тому</translation>
 <translation id="5857090052475505287">Нова папка</translation>
 <translation id="5857770089550859117">Введіть парольну фразу, щоб почати синхронізацію.</translation>
-<translation id="5860033963881614850">Вимк.</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">Переміщено 1 елемент</translation>
 <translation id="5897956970858271241">Перейти за скопійованим посиланням</translation>
 <translation id="5911030830365207728">Google Перекладач</translation>
 <translation id="5913600720976431809">Опції перекладу сторінки</translation>
-<translation id="5916664084637901428">Увімкнути</translation>
 <translation id="5938160824633642847">Пам’ять на пристрої майже заповнено. Звільніть місце та повторіть спробу.</translation>
 <translation id="5948291296578561264">Ви зможете зберігати знімки в бібліотеці фотографій.</translation>
 <translation id="5955891643922670672">Перегляд офлайн-версії</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index 8fe1ef2..db06d24 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 دن سے زیادہ پرانا</translation>
 <translation id="5857090052475505287">نیا فولڈر</translation>
 <translation id="5857770089550859117">مطابقت پذیری شروع کرنے کیلئے پاس فریز درکار ہے۔</translation>
-<translation id="5860033963881614850">آف</translation>
 <translation id="5869029295770560994">ٹھیک ہے، سمجھ آ گئی</translation>
 <translation id="5871497086027727873">1 آئٹم منتقل کیا گیا</translation>
 <translation id="5897956970858271241">کاپی کردہ لنک ملاحظہ کریں</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">صفحہ کا ترجمہ کرنے کے اختیارات</translation>
-<translation id="5916664084637901428">آن</translation>
 <translation id="5938160824633642847">آپ کے آلہ کا اسٹوریج تقریباً بھرا ہوا ہے۔ جگہ خالی کر کے دوبارہ کوشش کریں۔</translation>
 <translation id="5948291296578561264">یہ آپ کو اپنی تصویری لائبریری میں تصاویر محفوظ کرنے دیتا ہے۔</translation>
 <translation id="5955891643922670672">آف لائن ورژن دیکھنا</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index f082e22..d3eb1b3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 kundan oldin saqlanganlar</translation>
 <translation id="5857090052475505287">Yangi jild</translation>
 <translation id="5857770089550859117">Sinxronizatsiyani boshlash uchun kodli ibora zarur.</translation>
-<translation id="5860033963881614850">O‘chiq</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1 ta xatcho‘p ko‘chirildi</translation>
 <translation id="5897956970858271241">Nusxalangan havolani ochish</translation>
 <translation id="5911030830365207728">Google Tarjimon</translation>
 <translation id="5913600720976431809">Sahifalar tarjimasi parametrlari</translation>
-<translation id="5916664084637901428">Yoniq</translation>
 <translation id="5938160824633642847">Qurilmangizda biroz joy bo‘shating va qaytadan urining.</translation>
 <translation id="5948291296578561264">Rasmlarni fotosuratlar kutubxonasiga saqlaydi.</translation>
 <translation id="5955891643922670672">Oflayn versiyasini ko‘ryapsiz</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index b2204d55..64fa7ff3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Đã tồn tại hơn 30 ngày</translation>
 <translation id="5857090052475505287">Thư mục Mới</translation>
 <translation id="5857770089550859117">Yêu cầu cụm mật khẩu để bắt đầu đồng bộ hóa.</translation>
-<translation id="5860033963881614850">Tắt</translation>
 <translation id="5869029295770560994">OK</translation>
 <translation id="5871497086027727873">1 dấu trang đã được di chuyển</translation>
 <translation id="5897956970858271241">Truy cập vào liên kết đã sao chép</translation>
 <translation id="5911030830365207728">Google Dịch</translation>
 <translation id="5913600720976431809">Các tùy chọn dịch trang</translation>
-<translation id="5916664084637901428">Bật</translation>
 <translation id="5938160824633642847">Thiết bị của bạn gần hết không gian lưu trữ. Hãy giải phóng dung lượng và thử lại.</translation>
 <translation id="5948291296578561264">Điều này cho phép bạn lưu ảnh vào thư viện ảnh của mình.</translation>
 <translation id="5955891643922670672">Đang xem phiên bản ngoại tuyến</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 46d63e9c..a531f381 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">30 天之前的</translation>
 <translation id="5857090052475505287">新文件夹</translation>
 <translation id="5857770089550859117">必须输入密码才能开始同步。</translation>
-<translation id="5860033963881614850">关闭</translation>
 <translation id="5869029295770560994">知道了</translation>
 <translation id="5871497086027727873">移动了1项</translation>
 <translation id="5897956970858271241">访问复制的链接</translation>
 <translation id="5911030830365207728">Google 翻译</translation>
 <translation id="5913600720976431809">网页翻译选项</translation>
-<translation id="5916664084637901428">启用</translation>
 <translation id="5938160824633642847">您设备上的存储空间即将用尽,请释放空间并重试。</translation>
 <translation id="5948291296578561264">这样,您便可将照片保存到您的照片库中。</translation>
 <translation id="5955891643922670672">正在查看离线版本</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 2f9a34015b..6e86ba3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">超過 30 天</translation>
 <translation id="5857090052475505287">新資料夾</translation>
 <translation id="5857770089550859117">必須輸入密碼短語,才能開始同步資料。</translation>
-<translation id="5860033963881614850">關閉</translation>
 <translation id="5869029295770560994">好,我知道了</translation>
 <translation id="5871497086027727873">已移動 1 個項目</translation>
 <translation id="5897956970858271241">前往複製的連結</translation>
 <translation id="5911030830365207728">Google 翻譯</translation>
 <translation id="5913600720976431809">網頁翻譯選項</translation>
-<translation id="5916664084637901428">開啟</translation>
 <translation id="5938160824633642847">您裝置上的儲存空間即將用完。請釋放空間並再試一次。</translation>
 <translation id="5948291296578561264">這樣您便可將相片儲存至相片庫。</translation>
 <translation id="5955891643922670672">正在查看離線版本</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 63e3fe0..6f0b3542 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">超過 30 天前</translation>
 <translation id="5857090052475505287">新資料夾</translation>
 <translation id="5857770089550859117">必須輸入通關密語,才能開始進行同步處理。</translation>
-<translation id="5860033963881614850">關閉</translation>
 <translation id="5869029295770560994">好,我知道了</translation>
 <translation id="5871497086027727873">已移動 1 個項目</translation>
 <translation id="5897956970858271241">前往複製的連結</translation>
 <translation id="5911030830365207728">Google 翻譯</translation>
 <translation id="5913600720976431809">網頁翻譯選項</translation>
-<translation id="5916664084637901428">開啟</translation>
 <translation id="5938160824633642847">你的裝置空間即將用盡,請在釋出空間後再試一次。</translation>
 <translation id="5948291296578561264">可讓你將相片儲存至相片庫。</translation>
 <translation id="5955891643922670672">正在查看離線版</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 3f35afc4..5336e199 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -349,13 +349,11 @@
 <translation id="5854790677617711513">Kudala kunezinsuku ezingu-30</translation>
 <translation id="5857090052475505287">Ifolda entsha</translation>
 <translation id="5857770089550859117">Umushwana wokungena uyadingeka ukuze kuqalwe ukuvumelanisa.</translation>
-<translation id="5860033963881614850">Valiwe</translation>
 <translation id="5869029295770560994">OK, ngiyezwa</translation>
 <translation id="5871497086027727873">1 into ihanjsiwe</translation>
 <translation id="5897956970858271241">Vakashela isixhumanisi esikopishiwe</translation>
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5913600720976431809">Izinketho zokuhumusha ikhasi</translation>
-<translation id="5916664084637901428">Vuliwe</translation>
 <translation id="5938160824633642847">Idivayisi yakho isicishe igcwele. Khulula isikhala uphinde uzame futhi.</translation>
 <translation id="5948291296578561264">Lokhu kukuvumela ukuthi ulondoloze izithombe kulabhulali yakho yezithombe.</translation>
 <translation id="5955891643922670672">Ukubuka inguqulo engaxhunyiwe ku-inthanethi</translation>
diff --git a/ios/chrome/browser/infobars/overlays/BUILD.gn b/ios/chrome/browser/infobars/overlays/BUILD.gn
index 7c880c2..5530fa2 100644
--- a/ios/chrome/browser/infobars/overlays/BUILD.gn
+++ b/ios/chrome/browser/infobars/overlays/BUILD.gn
@@ -67,6 +67,7 @@
   deps = [
     ":overlays",
     "//base",
+    "//ios/chrome/browser/infobars",
     "//ios/chrome/browser/overlays",
     "//ios/chrome/browser/overlays/public/common/infobars",
   ]
diff --git a/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm b/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm
index c31aa0e..861d74c 100644
--- a/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm
+++ b/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h"
 
+#import "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h"
 #include "ios/chrome/browser/overlays/public/overlay_request.h"
 
@@ -19,5 +20,6 @@
 FakeInfobarOverlayRequestFactory::CreateInfobarRequest(
     infobars::InfoBar* infobar,
     InfobarOverlayType type) {
-  return OverlayRequest::CreateWithConfig<InfobarOverlayRequestConfig>(infobar);
+  return OverlayRequest::CreateWithConfig<InfobarOverlayRequestConfig>(
+      static_cast<InfoBarIOS*>(infobar));
 }
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_cancel_handler.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_cancel_handler.mm
index efd5a77..3117d53 100644
--- a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_cancel_handler.mm
+++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_cancel_handler.mm
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "components/infobars/core/infobar.h"
+#include "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h"
 #import "ios/chrome/browser/overlays/public/overlay_request.h"
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm
index 0774859..bfbba75 100644
--- a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm
+++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 
 #include "base/logging.h"
+#include "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_cancel_handler.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h"
@@ -47,7 +48,7 @@
   std::unique_ptr<OverlayRequest> request =
       request_factory_->CreateInfobarRequest(infobar, type);
   DCHECK(request.get());
-  DCHECK_EQ(infobar,
+  DCHECK_EQ(static_cast<InfoBarIOS*>(infobar),
             request->GetConfig<InfobarOverlayRequestConfig>()->infobar());
   OverlayRequestQueue* queue = queues_.at(type);
   std::unique_ptr<OverlayRequestCancelHandler> cancel_handler =
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl.mm b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
index 953cd59..09a142e 100644
--- a/ios/chrome/browser/overlays/overlay_presenter_impl.mm
+++ b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
@@ -208,9 +208,8 @@
 
   // Notify the observers that the overlay UI is about to be shown.
   for (auto& observer : observers_) {
-    if (!observer.GetRequestSupport(this)->IsRequestSupported(request))
-      return;
-    observer.WillShowOverlay(this, request);
+    if (observer.GetRequestSupport(this)->IsRequestSupported(request))
+      observer.WillShowOverlay(this, request);
   }
 
   // Present the overlay UI via the UI delegate.
@@ -231,9 +230,8 @@
   DCHECK_EQ(presentation_context_, presentation_context);
   DCHECK_EQ(presented_request_, request);
   for (auto& observer : observers_) {
-    if (!observer.GetRequestSupport(this)->IsRequestSupported(request))
-      return;
-    observer.DidShowOverlay(this, request);
+    if (observer.GetRequestSupport(this)->IsRequestSupported(request))
+      observer.DidShowOverlay(this, request);
   }
 }
 
@@ -271,9 +269,8 @@
 
   // Notify the observers that the overlay UI was hidden.
   for (auto& observer : observers_) {
-    if (!observer.GetRequestSupport(this)->IsRequestSupported(request))
-      return;
-    observer.DidHideOverlay(this, request);
+    if (observer.GetRequestSupport(this)->IsRequestSupported(request))
+      observer.DidHideOverlay(this, request);
   }
 
   // Only show the next overlay if the active request has changed, either
diff --git a/ios/chrome/browser/overlays/overlay_request_impl.cc b/ios/chrome/browser/overlays/overlay_request_impl.cc
index 2dbac92..cb41af59 100644
--- a/ios/chrome/browser/overlays/overlay_request_impl.cc
+++ b/ios/chrome/browser/overlays/overlay_request_impl.cc
@@ -21,6 +21,10 @@
   return &callback_manager_;
 }
 
+web::WebState* OverlayRequestImpl::GetQueueWebState() {
+  return queue_web_state_;
+}
+
 base::SupportsUserData* OverlayRequestImpl::data() {
   return this;
 }
diff --git a/ios/chrome/browser/overlays/overlay_request_impl.h b/ios/chrome/browser/overlays/overlay_request_impl.h
index 1e879a3..0dd0eff 100644
--- a/ios/chrome/browser/overlays/overlay_request_impl.h
+++ b/ios/chrome/browser/overlays/overlay_request_impl.h
@@ -19,9 +19,19 @@
 
   // OverlayRequest:
   OverlayCallbackManager* GetCallbackManager() override;
+  web::WebState* GetQueueWebState() override;
   base::SupportsUserData* data() override;
 
  private:
+  friend class OverlayRequestQueueImpl;
+
+  // Setter for the return value for GetQueueWebState().  Called by the
+  // OverlayRequestQueueImpl when the request is added.
+  void set_queue_web_state(web::WebState* queue_web_state) {
+    queue_web_state_ = queue_web_state;
+  }
+
+  web::WebState* queue_web_state_ = nullptr;
   OverlayCallbackManagerImpl callback_manager_;
 };
 
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_impl.mm b/ios/chrome/browser/overlays/overlay_request_queue_impl.mm
index 2547d29..3c4f3bc 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_impl.mm
+++ b/ios/chrome/browser/overlays/overlay_request_queue_impl.mm
@@ -9,6 +9,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #import "ios/chrome/browser/overlays/default_overlay_request_cancel_handler.h"
+#include "ios/chrome/browser/overlays/overlay_request_impl.h"
 #include "ios/chrome/browser/overlays/public/overlay_request.h"
 #import "ios/web/public/navigation/navigation_context.h"
 
@@ -105,10 +106,13 @@
     std::unique_ptr<OverlayRequestCancelHandler> cancel_handler) {
   DCHECK_LE(index, size());
   DCHECK(request.get());
+  // Create the cancel handler if necessary.
   if (!cancel_handler) {
     cancel_handler = std::make_unique<DefaultOverlayRequestCancelHandler>(
         request.get(), this, web_state_);
   }
+  static_cast<OverlayRequestImpl*>(request.get())
+      ->set_queue_web_state(web_state_);
   request_storages_.emplace(request_storages_.begin() + index,
                             std::move(request), std::move(cancel_handler));
   for (auto& observer : observers_) {
diff --git a/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm b/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm
index 05c4215..29a4169 100644
--- a/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm
+++ b/ios/chrome/browser/overlays/overlay_request_queue_impl_unittest.mm
@@ -68,7 +68,7 @@
     return request;
   }
 
- private:
+ protected:
   web::TestWebState web_state_;
   MockOverlayRequestQueueImplObserver observer_;
 };
@@ -182,3 +182,17 @@
 
   EXPECT_EQ(0U, queue()->size());
 }
+
+// Tests that the request's WebState is set up when it is added to the queue.
+TEST_F(OverlayRequestQueueImplTest, WebStateSetup) {
+  std::unique_ptr<OverlayRequest> added_request =
+      OverlayRequest::CreateWithConfig<FakeOverlayUserData>();
+  OverlayRequest* request = added_request.get();
+  ASSERT_FALSE(request->GetQueueWebState());
+
+  // Add the request and verify that the WebState is set.
+  EXPECT_CALL(observer(),
+              RequestAddedToQueue(queue(), request, queue()->size()));
+  queue()->AddRequest(std::move(added_request));
+  EXPECT_EQ(&web_state_, request->GetQueueWebState());
+}
diff --git a/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h b/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h
index e089f55..a424a9a0 100644
--- a/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h
@@ -6,21 +6,19 @@
 #define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_COMMON_INFOBARS_INFOBAR_OVERLAY_REQUEST_CONFIG_H_
 
 #import "ios/chrome/browser/infobars/infobar_type.h"
-#include "ios/chrome/browser/overlays/public/overlay_user_data.h"
+#include "ios/chrome/browser/overlays/public/overlay_request_config.h"
 
-namespace infobars {
-class InfoBar;
-}
+class InfoBarIOS;
 
 // OverlayUserData used to hold a pointer to an InfoBar.  Used as auxiliary
 // data for OverlayRequests for InfoBars.
 class InfobarOverlayRequestConfig
-    : public OverlayUserData<InfobarOverlayRequestConfig> {
+    : public OverlayRequestConfig<InfobarOverlayRequestConfig> {
  public:
   ~InfobarOverlayRequestConfig() override;
 
   // The InfoBar that triggered this OverlayRequest.
-  infobars::InfoBar* infobar() const { return infobar_; }
+  InfoBarIOS* infobar() const { return infobar_; }
   // |infobar_|'s type.
   InfobarType infobar_type() const { return infobar_type_; }
   // Whether |infobar_| has a badge.
@@ -28,9 +26,9 @@
 
  private:
   OVERLAY_USER_DATA_SETUP(InfobarOverlayRequestConfig);
-  explicit InfobarOverlayRequestConfig(infobars::InfoBar* infobar);
+  explicit InfobarOverlayRequestConfig(InfoBarIOS* infobar);
 
-  infobars::InfoBar* infobar_ = nullptr;
+  InfoBarIOS* infobar_ = nullptr;
   InfobarType infobar_type_;
   bool has_badge_ = false;
 };
diff --git a/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.mm b/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.mm
index 689eb74f..a378f9f 100644
--- a/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.mm
+++ b/ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.mm
@@ -16,11 +16,9 @@
 
 OVERLAY_USER_DATA_SETUP_IMPL(InfobarOverlayRequestConfig);
 
-InfobarOverlayRequestConfig::InfobarOverlayRequestConfig(InfoBar* infobar)
+InfobarOverlayRequestConfig::InfobarOverlayRequestConfig(InfoBarIOS* infobar)
     : infobar_(infobar),
-      infobar_type_(
-          static_cast<InfoBarIOS*>(infobar)->InfobarUIDelegate().infobarType),
-      has_badge_(
-          static_cast<InfoBarIOS*>(infobar)->InfobarUIDelegate().hasBadge) {}
+      infobar_type_(infobar->InfobarUIDelegate().infobarType),
+      has_badge_(infobar->InfobarUIDelegate().hasBadge) {}
 
 InfobarOverlayRequestConfig::~InfobarOverlayRequestConfig() = default;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.mm b/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.mm
index fedca22..7aa405a 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.mm
+++ b/ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.mm
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "base/strings/sys_string_conversions.h"
 #include "components/infobars/core/infobar.h"
+#include "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h"
 #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
 
@@ -43,5 +44,6 @@
 
 void SavePasswordInfobarBannerOverlayRequestConfig::CreateAuxilliaryData(
     base::SupportsUserData* user_data) {
-  InfobarOverlayRequestConfig::CreateForUserData(user_data, infobar_);
+  InfobarOverlayRequestConfig::CreateForUserData(
+      user_data, static_cast<InfoBarIOS*>(infobar_));
 }
diff --git a/ios/chrome/browser/overlays/public/overlay_request.h b/ios/chrome/browser/overlays/public/overlay_request.h
index 89409783..179d9d6b2 100644
--- a/ios/chrome/browser/overlays/public/overlay_request.h
+++ b/ios/chrome/browser/overlays/public/overlay_request.h
@@ -10,6 +10,9 @@
 #include "base/supports_user_data.h"
 
 class OverlayCallbackManager;
+namespace web {
+class WebState;
+}
 
 // Model object used to track overlays requested for OverlayManager.
 class OverlayRequest {
@@ -44,6 +47,12 @@
   // user interaction information back to the reqeuster.
   virtual OverlayCallbackManager* GetCallbackManager() = 0;
 
+  // Returns the WebState into whose OverlayRequestQueue this request was added.
+  // Default value before being added to a queue is null.  After being added to
+  // a queue, the WebState will be set for the remainder of the request's
+  // lifetime.
+  virtual web::WebState* GetQueueWebState() = 0;
+
  protected:
   OverlayRequest() = default;
 
diff --git a/ios/chrome/browser/ui/webui/gcm/OWNERS b/ios/chrome/browser/ui/webui/gcm/OWNERS
index 2271273..2a4d6bc 100644
--- a/ios/chrome/browser/ui/webui/gcm/OWNERS
+++ b/ios/chrome/browser/ui/webui/gcm/OWNERS
@@ -1,7 +1,6 @@
 dimich@chromium.org
 fgorski@chromium.org
 jianli@chromium.org
-zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
 
diff --git a/jingle/OWNERS b/jingle/OWNERS
index 3526efa..c0c76bd 100644
--- a/jingle/OWNERS
+++ b/jingle/OWNERS
@@ -1,4 +1,4 @@
 sergeyu@chromium.org
-zea@chromium.org
+thestig@chromium.org
 # COMPONENT: Blink>WebRTC
 # TEAM: net-dev@chromium.org
diff --git a/net/base/net_errors.cc b/net/base/net_errors.cc
index 7e7ee37ac..ed6bc4514 100644
--- a/net/base/net_errors.cc
+++ b/net/base/net_errors.cc
@@ -63,8 +63,8 @@
 }
 
 bool IsDnsError(int error) {
-  DCHECK_NE(ERR_NAME_RESOLUTION_FAILED, error);
-  return error == ERR_NAME_NOT_RESOLVED;
+  return (error == ERR_NAME_NOT_RESOLVED ||
+          error == ERR_NAME_RESOLUTION_FAILED);
 }
 
 Error FileErrorToNetError(base::File::Error file_error) {
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index 264ab583..092ac6f 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -66,9 +66,12 @@
     // On any other returned value, the request was handled synchronously and
     // |callback| will not be invoked.
     //
-    // Results in ERR_NAME_NOT_RESOLVED if the hostname is not resolved. More
-    // detail about the underlying error can be retrieved using
-    // GetResolveErrorInfo().
+    // Results in ERR_NAME_NOT_RESOLVED if the hostname is invalid, or if it is
+    // an incompatible IP literal (e.g. IPv6 is disabled and it is an IPv6
+    // literal).
+    //
+    // Results in ERR_DNS_CACHE_MISS if only fast local sources are to be
+    // queried and a cache lookup attempt fails.
     //
     // The parent HostResolver must still be alive when Start() is called,  but
     // if it is destroyed before an asynchronous result completes, the request
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index a98331a..795386a 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -650,7 +650,7 @@
     LogFinishRequest(error);
 
     DCHECK(callback_);
-    std::move(callback_).Run(HostResolver::SquashErrorCode(error));
+    std::move(callback_).Run(error);
   }
 
   Job* job() const { return job_; }
@@ -2992,7 +2992,7 @@
                     effective_secure_dns_mode, base::TimeDelta());
     request->set_error_info(results.error(),
                             false /* is_secure_network_error */);
-    return HostResolver::SquashErrorCode(results.error());
+    return results.error();
   }
 
   CreateAndStartJob(effective_query_type, effective_host_resolver_flags,
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc
index d4f1d9e..12fe95c0 100644
--- a/net/url_request/http_with_dns_over_https_unittest.cc
+++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -313,7 +313,7 @@
   EXPECT_EQ(test_https_requests_served_, 0u);
 
   EXPECT_TRUE(d.response_completed());
-  EXPECT_EQ(d.request_status(), net::ERR_NAME_NOT_RESOLVED);
+  EXPECT_EQ(d.request_status(), net::ERR_DNS_MALFORMED_RESPONSE);
 
   const auto& resolve_error_info = req->response_info().resolve_error_info;
   EXPECT_TRUE(resolve_error_info.is_secure_network_error);
diff --git a/sandbox/win/src/win_utils.cc b/sandbox/win/src/win_utils.cc
index 85be8d1..0c97c31b 100644
--- a/sandbox/win/src/win_utils.cc
+++ b/sandbox/win/src/win_utils.cc
@@ -234,7 +234,6 @@
             (path.rfind(L'\\') == kNTDotPrefixLen - 1)) {
           break;
         }
-        NOTREACHED_NT();
         return error;
       }
     } else if (FILE_ATTRIBUTE_REPARSE_POINT & attributes) {
diff --git a/services/device/hid/hid_connection_impl_unittest.cc b/services/device/hid/hid_connection_impl_unittest.cc
index a9fcc997..6cad1da8 100644
--- a/services/device/hid/hid_connection_impl_unittest.cc
+++ b/services/device/hid/hid_connection_impl_unittest.cc
@@ -177,7 +177,7 @@
     hid_collection_info->usage = mojom::HidUsageAndPage::New(0, 0);
     hid_collection_info->report_ids.push_back(kTestReportId);
     return base::MakeRefCounted<HidDeviceInfo>(
-        kTestDeviceId, 0x1234, 0xabcd, "product name", "serial number",
+        kTestDeviceId, "1", 0x1234, 0xabcd, "product name", "serial number",
         mojom::HidBusType::kHIDBusTypeUSB, std::move(hid_collection_info),
         kMaxReportSizeBytes, kMaxReportSizeBytes, 0);
   }
diff --git a/services/device/hid/hid_device_info.cc b/services/device/hid/hid_device_info.cc
index 15a5e62e..e58a902 100644
--- a/services/device/hid/hid_device_info.cc
+++ b/services/device/hid/hid_device_info.cc
@@ -11,6 +11,7 @@
 namespace device {
 
 HidDeviceInfo::HidDeviceInfo(const HidPlatformDeviceId& platform_device_id,
+                             const std::string& physical_device_id,
                              uint16_t vendor_id,
                              uint16_t product_id,
                              const std::string& product_name,
@@ -31,13 +32,14 @@
                                &max_feature_report_size);
 
   device_ = mojom::HidDeviceInfo::New(
-      base::GenerateGUID(), vendor_id, product_id, product_name, serial_number,
-      bus_type, report_descriptor, std::move(collections), has_report_id,
-      max_input_report_size, max_output_report_size, max_feature_report_size,
-      device_node);
+      base::GenerateGUID(), physical_device_id, vendor_id, product_id,
+      product_name, serial_number, bus_type, report_descriptor,
+      std::move(collections), has_report_id, max_input_report_size,
+      max_output_report_size, max_feature_report_size, device_node);
 }
 
 HidDeviceInfo::HidDeviceInfo(const HidPlatformDeviceId& platform_device_id,
+                             const std::string& physical_device_id,
                              uint16_t vendor_id,
                              uint16_t product_id,
                              const std::string& product_name,
@@ -54,10 +56,10 @@
 
   std::vector<uint8_t> report_descriptor;
   device_ = mojom::HidDeviceInfo::New(
-      base::GenerateGUID(), vendor_id, product_id, product_name, serial_number,
-      bus_type, report_descriptor, std::move(collections), has_report_id,
-      max_input_report_size, max_output_report_size, max_feature_report_size,
-      "");
+      base::GenerateGUID(), physical_device_id, vendor_id, product_id,
+      product_name, serial_number, bus_type, report_descriptor,
+      std::move(collections), has_report_id, max_input_report_size,
+      max_output_report_size, max_feature_report_size, "");
 }
 
 HidDeviceInfo::~HidDeviceInfo() {}
diff --git a/services/device/hid/hid_device_info.h b/services/device/hid/hid_device_info.h
index 0ea0ccdf..03dc04f 100644
--- a/services/device/hid/hid_device_info.h
+++ b/services/device/hid/hid_device_info.h
@@ -27,6 +27,7 @@
 class HidDeviceInfo : public base::RefCountedThreadSafe<HidDeviceInfo> {
  public:
   HidDeviceInfo(const HidPlatformDeviceId& platform_device_id,
+                const std::string& physical_device_id,
                 uint16_t vendor_id,
                 uint16_t product_id,
                 const std::string& product_name,
@@ -36,6 +37,7 @@
                 std::string device_node = "");
 
   HidDeviceInfo(const HidPlatformDeviceId& platform_device_id,
+                const std::string& physical_device_id,
                 uint16_t vendor_id,
                 uint16_t product_id,
                 const std::string& product_name,
@@ -53,6 +55,9 @@
   const HidPlatformDeviceId& platform_device_id() const {
     return platform_device_id_;
   }
+  const std::string& physical_device_id() const {
+    return device_->physical_device_id;
+  }
   uint16_t vendor_id() const { return device_->vendor_id; }
   uint16_t product_id() const { return device_->product_id; }
   const std::string& product_name() const { return device_->product_name; }
diff --git a/services/device/hid/hid_manager_unittest.cc b/services/device/hid/hid_manager_unittest.cc
index 9e20233..4d8ec85 100644
--- a/services/device/hid/hid_manager_unittest.cc
+++ b/services/device/hid/hid_manager_unittest.cc
@@ -23,9 +23,9 @@
 namespace {
 
 #if defined(OS_MACOSX)
-const uint64_t kTestDeviceIds[] = {1, 2};
+const uint64_t kTestDeviceIds[] = {0, 1, 2};
 #else
-const char* kTestDeviceIds[] = {"A", "B"};
+const char* const kTestDeviceIds[] = {"0", "1", "2"};
 #endif
 
 class MockHidManagerClient : public mojom::HidManagerClient {
@@ -136,12 +136,41 @@
 
   void TearDown() override { HidManagerImpl::SetHidServiceForTesting(nullptr); }
 
-  void AddDevice(scoped_refptr<HidDeviceInfo> device_info) {
+  scoped_refptr<HidDeviceInfo> AddTestDevice0() {
+    // Construct a minimal HidDeviceInfo.
+    auto device_info = base::MakeRefCounted<HidDeviceInfo>(
+        kTestDeviceIds[0], "physical id 0", /*vendor_id=*/0, /*product_id=*/0,
+        "Hid Service Unit Test", "HidDevice-0",
+        mojom::HidBusType::kHIDBusTypeUSB,
+        /*report_descriptor=*/std::vector<uint8_t>());
     mock_hid_service_->AddDevice(device_info);
+    return device_info;
   }
 
-  void RemoveDevice(const HidPlatformDeviceId& platform_device_id) {
-    mock_hid_service_->RemoveDevice(platform_device_id);
+  scoped_refptr<HidDeviceInfo> AddTestDevice1() {
+    // Construct a minimal HidDeviceInfo with a different device ID than above.
+    auto device_info = base::MakeRefCounted<HidDeviceInfo>(
+        kTestDeviceIds[1], "physical id 1", /*vendor_id=*/0, /*product_id=*/0,
+        "Hid Service Unit Test", "HidDevice-1",
+        mojom::HidBusType::kHIDBusTypeUSB,
+        /*report_descriptor=*/std::vector<uint8_t>());
+    mock_hid_service_->AddDevice(device_info);
+    return device_info;
+  }
+
+  scoped_refptr<HidDeviceInfo> AddTestDeviceWithTopLevelCollection() {
+    // Construct a HidDeviceInfo with a top-level collection. The collection has
+    // a usage ID from the FIDO usage page.
+    auto collection_info = mojom::HidCollectionInfo::New();
+    collection_info->usage = mojom::HidUsageAndPage::New(1, 0xf1d0);
+    auto device_info = base::MakeRefCounted<HidDeviceInfo>(
+        kTestDeviceIds[2], "physical id 2", /*vendor_id=*/0, /*product_id=*/0,
+        "Hid Service Unit Test", "HidDevice-2",
+        mojom::HidBusType::kHIDBusTypeUSB, std::move(collection_info),
+        /*max_input_report_size=*/64, /*max_output_report_size=*/64,
+        /*max_feature_report_size=*/64);
+    mock_hid_service_->AddDevice(device_info);
+    return device_info;
   }
 
   mojo::Remote<mojom::HidManager> hid_manager_;
@@ -152,16 +181,9 @@
 
 // Test the GetDevices.
 TEST_F(HidManagerTest, GetDevicesOnly) {
-  // Add two hid devices
-  auto device0 = base::MakeRefCounted<HidDeviceInfo>(
-      kTestDeviceIds[0], 0, 0, "Hid Service Unit Test", "HidDevice-0",
-      mojom::HidBusType::kHIDBusTypeUSB, std::vector<uint8_t>());
-
-  auto device1 = base::MakeRefCounted<HidDeviceInfo>(
-      kTestDeviceIds[1], 0, 0, "Hid Service Unit Test", "HidDevice-1",
-      mojom::HidBusType::kHIDBusTypeUSB, std::vector<uint8_t>());
-  mock_hid_service_->AddDevice(device0);
-  mock_hid_service_->AddDevice(device1);
+  // Add two hid devices.
+  AddTestDevice0();
+  AddTestDevice1();
   mock_hid_service_->FirstEnumerationComplete();
 
   // Expect two devices will be received in OnGetDevices().
@@ -175,10 +197,7 @@
 // interface.
 TEST_F(HidManagerTest, GetDevicesAndSetClient) {
   // Add one hid device.
-  auto device0 = base::MakeRefCounted<HidDeviceInfo>(
-      kTestDeviceIds[0], 0, 0, "Hid Service Unit Test", "HidDevice-0",
-      mojom::HidBusType::kHIDBusTypeUSB, std::vector<uint8_t>());
-  mock_hid_service_->AddDevice(device0);
+  auto device0 = AddTestDevice0();
   mock_hid_service_->FirstEnumerationComplete();
 
   auto client = std::make_unique<MockHidManagerClient>();
@@ -197,10 +216,7 @@
 
   // Add another hid device, expect MockHidManagerClient::DeviceAdded() will be
   // called, and the guid should be same as expected.
-  auto device1 = base::MakeRefCounted<HidDeviceInfo>(
-      kTestDeviceIds[1], 0, 0, "Hid Service Unit Test", "HidDevice-1",
-      mojom::HidBusType::kHIDBusTypeUSB, std::vector<uint8_t>());
-  mock_hid_service_->AddDevice(device1);
+  auto device1 = AddTestDevice1();
   {
     base::RunLoop run_loop;
     client->SetQuitClosure(run_loop.QuitClosure());
@@ -221,13 +237,8 @@
 
 // Test the Connect and the mojom::HidConnection interface.
 TEST_F(HidManagerTest, TestHidConnectionInterface) {
-  // Add one hid device.
-  auto c_info = mojom::HidCollectionInfo::New();
-  c_info->usage = mojom::HidUsageAndPage::New(1, 0xf1d0);
-  auto device0 = base::MakeRefCounted<HidDeviceInfo>(
-      kTestDeviceIds[0], 0, 0, "Hid Service Unit Test", "HidDevice-0",
-      mojom::HidBusType::kHIDBusTypeUSB, std::move(c_info), 64, 64, 64);
-  mock_hid_service_->AddDevice(device0);
+  // Add a hid device with a top-level collection.
+  auto device = AddTestDeviceWithTopLevelCollection();
   mock_hid_service_->FirstEnumerationComplete();
 
   auto client = std::make_unique<MockHidManagerClient>();
@@ -248,7 +259,7 @@
   {
     base::RunLoop run_loop;
     hid_manager_->Connect(
-        device0->device_guid(),
+        device->device_guid(),
         /*connection_client=*/mojo::NullRemote(),
         /*watcher=*/mojo::NullRemote(),
         base::BindOnce(&OnConnect, run_loop.QuitClosure(), client.get()));
diff --git a/services/device/hid/hid_service_linux.cc b/services/device/hid/hid_service_linux.cc
index 74aca99..3b2f5e0 100644
--- a/services/device/hid/hid_service_linux.cc
+++ b/services/device/hid/hid_service_linux.cc
@@ -154,13 +154,14 @@
     if (!base::ReadFileToString(report_descriptor_path, &report_descriptor_str))
       return;
 
-    scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo(
-        platform_device_id, vendor_id, product_id, product_name, serial_number,
-        // TODO(reillyg): Detect Bluetooth. crbug.com/443335
-        mojom::HidBusType::kHIDBusTypeUSB,
-        std::vector<uint8_t>(report_descriptor_str.begin(),
-                             report_descriptor_str.end()),
-        device_node));
+    scoped_refptr<HidDeviceInfo> device_info(
+        new HidDeviceInfo(platform_device_id, /*physical_device_id=*/"",
+                          vendor_id, product_id, product_name, serial_number,
+                          // TODO(reillyg): Detect Bluetooth. crbug.com/443335
+                          mojom::HidBusType::kHIDBusTypeUSB,
+                          std::vector<uint8_t>(report_descriptor_str.begin(),
+                                               report_descriptor_str.end()),
+                          device_node));
 
     task_runner_->PostTask(
         FROM_HERE,
diff --git a/services/device/hid/hid_service_mac.cc b/services/device/hid/hid_service_mac.cc
index bb16f5af..f7252c8a 100644
--- a/services/device/hid/hid_service_mac.cc
+++ b/services/device/hid/hid_service_mac.cc
@@ -79,7 +79,8 @@
   }
 
   return new HidDeviceInfo(
-      entry_id, GetIntProperty(service, CFSTR(kIOHIDVendorIDKey)),
+      entry_id, /*physical_device_id=*/"",
+      GetIntProperty(service, CFSTR(kIOHIDVendorIDKey)),
       GetIntProperty(service, CFSTR(kIOHIDProductIDKey)),
       GetStringProperty(service, CFSTR(kIOHIDProductKey)),
       GetStringProperty(service, CFSTR(kIOHIDSerialNumberKey)),
diff --git a/services/device/hid/hid_service_win.cc b/services/device/hid/hid_service_win.cc
index ec12d060..efccc8a 100644
--- a/services/device/hid/hid_service_win.cc
+++ b/services/device/hid/hid_service_win.cc
@@ -255,8 +255,8 @@
   // The descriptor is unavailable on Windows because HID devices are exposed to
   // user-space as individual top-level collections.
   scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo(
-      device_path, attrib.VendorID, attrib.ProductID, product_name,
-      serial_number,
+      device_path, /*physical_device_id=*/"", attrib.VendorID, attrib.ProductID,
+      product_name, serial_number,
       // TODO(reillyg): Detect Bluetooth. crbug.com/443335
       mojom::HidBusType::kHIDBusTypeUSB, std::move(collection_info),
       max_input_report_size, max_output_report_size, max_feature_report_size));
diff --git a/services/device/public/cpp/hid/fake_hid_manager.cc b/services/device/public/cpp/hid/fake_hid_manager.cc
index a574928..ca3c5c63 100644
--- a/services/device/public/cpp/hid/fake_hid_manager.cc
+++ b/services/device/public/cpp/hid/fake_hid_manager.cc
@@ -134,6 +134,7 @@
 }
 
 mojom::HidDeviceInfoPtr FakeHidManager::CreateAndAddDevice(
+    const std::string& physical_device_id,
     uint16_t vendor_id,
     uint16_t product_id,
     const std::string& product_name,
@@ -141,6 +142,7 @@
     mojom::HidBusType bus_type) {
   mojom::HidDeviceInfoPtr device = mojom::HidDeviceInfo::New();
   device->guid = base::GenerateGUID();
+  device->physical_device_id = physical_device_id;
   device->vendor_id = vendor_id;
   device->product_id = product_id;
   device->product_name = product_name;
@@ -151,6 +153,7 @@
 }
 
 mojom::HidDeviceInfoPtr FakeHidManager::CreateAndAddDeviceWithTopLevelUsage(
+    const std::string& physical_device_id,
     uint16_t vendor_id,
     uint16_t product_id,
     const std::string& product_name,
@@ -160,6 +163,7 @@
     uint16_t usage) {
   mojom::HidDeviceInfoPtr device = mojom::HidDeviceInfo::New();
   device->guid = base::GenerateGUID();
+  device->physical_device_id = physical_device_id;
   device->vendor_id = vendor_id;
   device->product_id = product_id;
   device->product_name = product_name;
diff --git a/services/device/public/cpp/hid/fake_hid_manager.h b/services/device/public/cpp/hid/fake_hid_manager.h
index da1033d..e4319ee 100644
--- a/services/device/public/cpp/hid/fake_hid_manager.h
+++ b/services/device/public/cpp/hid/fake_hid_manager.h
@@ -56,12 +56,15 @@
       mojo::PendingRemote<mojom::HidConnectionWatcher> watcher,
       ConnectCallback callback) override;
 
-  mojom::HidDeviceInfoPtr CreateAndAddDevice(uint16_t vendor_id,
-                                             uint16_t product_id,
-                                             const std::string& product_name,
-                                             const std::string& serial_number,
-                                             mojom::HidBusType bus_type);
+  mojom::HidDeviceInfoPtr CreateAndAddDevice(
+      const std::string& physical_device_id,
+      uint16_t vendor_id,
+      uint16_t product_id,
+      const std::string& product_name,
+      const std::string& serial_number,
+      mojom::HidBusType bus_type);
   mojom::HidDeviceInfoPtr CreateAndAddDeviceWithTopLevelUsage(
+      const std::string& physical_device_id,
       uint16_t vendor_id,
       uint16_t product_id,
       const std::string& product_name,
diff --git a/services/device/public/cpp/hid/hid_device_filter_unittest.cc b/services/device/public/cpp/hid/hid_device_filter_unittest.cc
index 70688ac..7192ef9 100644
--- a/services/device/public/cpp/hid/hid_device_filter_unittest.cc
+++ b/services/device/public/cpp/hid/hid_device_filter_unittest.cc
@@ -27,7 +27,7 @@
  public:
   void SetUp() override {
     device_info_ = new HidDeviceInfo(
-        kTestDeviceId, 0x046d, 0xc31c, "Test Keyboard", "123ABC",
+        kTestDeviceId, "1", 0x046d, 0xc31c, "Test Keyboard", "123ABC",
         mojom::HidBusType::kHIDBusTypeUSB,
         std::vector<uint8_t>(kKeyboard, kKeyboard + kKeyboardSize));
   }
diff --git a/services/device/public/mojom/hid.mojom b/services/device/public/mojom/hid.mojom
index 1c67e69a..1631214 100644
--- a/services/device/public/mojom/hid.mojom
+++ b/services/device/public/mojom/hid.mojom
@@ -281,18 +281,56 @@
 // keyboard/mouse combo device would expose separate logical HID devices for
 // keyboard and mouse functionality.
 struct HidDeviceInfo {
+  // A random GUID assigned to the device during enumeration. The device GUID is
+  // stable as long as the application is running and the device remains
+  // connected to the system.
   string guid;
+
+  // A platform-specific string identifier for the physical device. When a
+  // single physical device exposes multiple logical devices, the logical
+  // devices will have the same value for |physical_device_id|.
+  string physical_device_id;
+
+  // The vendor ID value reported by the device. Vendor IDs are 16-bit values
+  // assigned by the USB-IF or Bluetooth SIG to manufacturers of USB and
+  // Bluetooth devices.
+  // TODO(mattreynolds): Indicate whether the vendor ID was assigned by USB-IF
+  // or Bluetooth SIG.
   uint16 vendor_id;
+
+  // The product ID reported by the device. Product IDs are 16-bit values
+  // assigned by the manufacturer to identify a particular device model.
   uint16 product_id;
+
+  // The product name string reported by the device, or an empty string if no
+  // product name is available.
   string product_name;
+
+  // The USB serial number string, or an empty string if the device is not a USB
+  // device or has no serial number.
   string serial_number;
+
+  // The bus used to connect this device to the system.
   HidBusType bus_type;
+
+  // An array of bytes representing the HID report descriptor reported by the
+  // device, or an empty array if the report descriptor could not be read.
   array<uint8> report_descriptor;
+
+  // A structured representation of the information contained in the HID report
+  // descriptor.
   array<HidCollectionInfo> collections;
+
+  // True if the device uses report IDs.
   bool has_report_id;
+
+  // The maximum size in bytes of input, output, and feature reports supported
+  // by the device.
   uint64 max_input_report_size;
   uint64 max_output_report_size;
   uint64 max_feature_report_size;
+
+  // A platform-specific string identifier for the logical device.
   string device_node;
 };
 
diff --git a/services/network/public/mojom/quic_transport.mojom b/services/network/public/mojom/quic_transport.mojom
index 37304527..89ebe19 100644
--- a/services/network/public/mojom/quic_transport.mojom
+++ b/services/network/public/mojom/quic_transport.mojom
@@ -12,6 +12,23 @@
   // A datagram message is sent from the client. The response message represents
   // whether the peer has sent or discarded the datagram.
   SendDatagram(mojo_base.mojom.ReadOnlyBuffer data) => (bool result);
+
+  // Stream creation initiated by the client. |succeeded| represents whether
+  // the stream is created successfully, and |stream_id| is meaningful only
+  // when |succeeded| is true. |writable| is nullable, to support both
+  // unidirectional and bidirectional streams.
+  CreateStream(handle<data_pipe_consumer> readable,
+               handle<data_pipe_producer>? writable) =>
+      (bool succeeded, uint32 stream_id);
+
+  // Accept a bidirectional stream created by the server.
+  AcceptBidirectionalStream() => (uint32 stream_id,
+                  handle<data_pipe_consumer> readable,
+                  handle<data_pipe_producer> writable);
+
+  // Accept a unidirectional stream created by the server.
+  AcceptUnidirectionalStream() => (uint32 stream_id,
+                  handle<data_pipe_consumer> readable);
 };
 
 // A mojo interface for the client of QuicTransport.
diff --git a/services/network/quic_transport.cc b/services/network/quic_transport.cc
index 80607f49..e46480e1 100644
--- a/services/network/quic_transport.cc
+++ b/services/network/quic_transport.cc
@@ -4,6 +4,7 @@
 
 #include "services/network/quic_transport.h"
 
+#include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "net/base/io_buffer.h"
@@ -12,11 +13,240 @@
 #include "net/third_party/quiche/src/quic/core/quic_types.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_span.h"
+#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_stream.h"
 #include "services/network/network_context.h"
 #include "services/network/public/mojom/quic_transport.mojom.h"
 
 namespace network {
 
+class QuicTransport::Stream final {
+ public:
+  class StreamVisitor final : public quic::QuicTransportStream::Visitor {
+   public:
+    explicit StreamVisitor(Stream* stream)
+        : stream_(stream->weak_factory_.GetWeakPtr()) {}
+    ~StreamVisitor() override {
+      if (stream_) {
+        stream_->incoming_ = nullptr;
+        stream_->outgoing_ = nullptr;
+      }
+    }
+
+    // Visitor implementation:
+    void OnCanRead() override {
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(&Stream::Receive, stream_));
+    }
+    void OnFinRead() override {
+      if (stream_) {
+        stream_->OnFinRead();
+      }
+    }
+    void OnCanWrite() override {
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(&Stream::Send, stream_));
+    }
+
+   private:
+    const base::WeakPtr<Stream> stream_;
+  };
+
+  // Bidirectional
+  Stream(QuicTransport* transport,
+         quic::QuicTransportStream* stream,
+         mojo::ScopedDataPipeConsumerHandle readable,
+         mojo::ScopedDataPipeProducerHandle writable)
+      : transport_(transport),
+        id_(stream->id()),
+        outgoing_(stream),
+        incoming_(stream),
+        readable_(std::move(readable)),
+        writable_(std::move(writable)),
+        readable_watcher_(FROM_HERE, ArmingPolicy::AUTOMATIC),
+        writable_watcher_(FROM_HERE, ArmingPolicy::AUTOMATIC) {
+    DCHECK(outgoing_);
+    DCHECK(incoming_);
+    DCHECK(readable_);
+    DCHECK(writable_);
+    Init();
+  }
+
+  // Unidirectional: outgoing
+  Stream(QuicTransport* transport,
+         quic::QuicTransportStream* outgoing,
+         mojo::ScopedDataPipeConsumerHandle readable)
+      : transport_(transport),
+        id_(outgoing->id()),
+        outgoing_(outgoing),
+        readable_(std::move(readable)),
+        readable_watcher_(FROM_HERE, ArmingPolicy::AUTOMATIC),
+        writable_watcher_(FROM_HERE, ArmingPolicy::AUTOMATIC) {
+    DCHECK(outgoing_);
+    DCHECK(readable_);
+    Init();
+  }
+
+  // Unidirectional: incoming
+  Stream(QuicTransport* transport,
+         quic::QuicTransportStream* incoming,
+         mojo::ScopedDataPipeProducerHandle writable)
+      : transport_(transport),
+        id_(incoming->id()),
+        incoming_(incoming),
+        writable_(std::move(writable)),
+        readable_watcher_(FROM_HERE, ArmingPolicy::AUTOMATIC),
+        writable_watcher_(FROM_HERE, ArmingPolicy::AUTOMATIC) {
+    DCHECK(incoming_);
+    DCHECK(writable_);
+    Init();
+  }
+
+  ~Stream() { transport_->transport_->session()->CloseStream(id_); }
+
+ private:
+  using ArmingPolicy = mojo::SimpleWatcher::ArmingPolicy;
+
+  void Init() {
+    if (outgoing_) {
+      DCHECK(readable_);
+      outgoing_->set_visitor(std::make_unique<StreamVisitor>(this));
+      readable_watcher_.Watch(
+          readable_.get(),
+          MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
+          MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED,
+          base::BindRepeating(&Stream::OnReadable, base::Unretained(this)));
+    }
+
+    if (incoming_) {
+      DCHECK(writable_);
+      if (incoming_ != outgoing_) {
+        incoming_->set_visitor(std::make_unique<StreamVisitor>(this));
+      }
+      writable_watcher_.Watch(
+          writable_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
+          MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED,
+          base::BindRepeating(&Stream::OnWritable, base::Unretained(this)));
+    }
+  }
+
+  void OnReadable(MojoResult result, const mojo::HandleSignalsState& state) {
+    DCHECK_EQ(result, MOJO_RESULT_OK);
+    Send();
+  }
+
+  void Send() {
+    while (outgoing_ && outgoing_->CanWrite()) {
+      const void* data = nullptr;
+      uint32_t available = 0;
+      MojoResult result = readable_->BeginReadData(
+          &data, &available, MOJO_BEGIN_READ_DATA_FLAG_NONE);
+      if (result == MOJO_RESULT_SHOULD_WAIT) {
+        return;
+      }
+      if (result == MOJO_RESULT_FAILED_PRECONDITION) {
+        const bool result = outgoing_->SendFin();
+        // |SendFin| must succeed when CanWrite() returns true.
+        DCHECK(result);
+        outgoing_ = nullptr;
+        readable_watcher_.Cancel();
+        readable_.reset();
+        // We need an explicit signal to close the stream.
+        // TODO(yhirano): Add CloseStream mojo message.
+        MayDisposeLater();
+        return;
+      }
+      DCHECK_EQ(result, MOJO_RESULT_OK);
+
+      bool send_result = outgoing_->Write(quiche::QuicheStringPiece(
+          reinterpret_cast<const char*>(data), available));
+      if (!send_result) {
+        // TODO(yhirano): Handle this failure.
+        readable_->EndReadData(0);
+        return;
+      }
+      readable_->EndReadData(available);
+    }
+  }
+
+  void OnWritable(MojoResult result, const mojo::HandleSignalsState& state) {
+    DCHECK_EQ(result, MOJO_RESULT_OK);
+    Receive();
+  }
+
+  void Receive() {
+    while (incoming_ && incoming_->ReadableBytes() > 0) {
+      void* buffer = nullptr;
+      uint32_t available = 0;
+      base::AutoReset<bool> auto_reset(&in_two_phase_write_, true);
+      MojoResult result = writable_->BeginWriteData(
+          &buffer, &available, MOJO_BEGIN_WRITE_DATA_FLAG_NONE);
+      if (result == MOJO_RESULT_SHOULD_WAIT) {
+        return;
+      }
+      if (result == MOJO_RESULT_FAILED_PRECONDITION) {
+        // We need an explicit signal to close the stream.
+        // TODO(yhirano): Add CloseStream mojo message.
+        return;
+      }
+      DCHECK_EQ(result, MOJO_RESULT_OK);
+
+      const size_t num_read_bytes =
+          incoming_->Read(reinterpret_cast<char*>(buffer), available);
+      writable_->EndWriteData(num_read_bytes);
+      if (!incoming_) {
+        // |incoming_| can be null here, because OnFinRead can be called in
+        // QuicTransportStream::Read.
+        writable_watcher_.Cancel();
+        writable_.reset();
+        MayDisposeLater();
+        return;
+      }
+    }
+  }
+
+  void OnFinRead() {
+    incoming_ = nullptr;
+    if (in_two_phase_write_) {
+      return;
+    }
+    writable_watcher_.Cancel();
+    writable_.reset();
+  }
+
+  void Dispose() {
+    transport_->streams_.erase(id_);
+    // Deletes |this|.
+  }
+  void MayDisposeLater() {
+    if (outgoing_ || incoming_) {
+      return;
+    }
+
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&Stream::Dispose, weak_factory_.GetWeakPtr()));
+  }
+
+  QuicTransport* const transport_;  // outlives |this|.
+  const uint32_t id_;
+  // |outgoing_| and |incoming_| point to the same stream when this is a
+  // bidirectional stream. They are owned by |transport_| (via
+  // quic::QuicSession), and the properties will be null-set when the streams
+  // are gone (via StreamVisitor).
+  quic::QuicTransportStream* outgoing_ = nullptr;
+  quic::QuicTransportStream* incoming_ = nullptr;
+  mojo::ScopedDataPipeConsumerHandle readable_;  // for |outgoing|
+  mojo::ScopedDataPipeProducerHandle writable_;  // for |incoming|
+
+  mojo::SimpleWatcher readable_watcher_;
+  mojo::SimpleWatcher writable_watcher_;
+
+  bool in_two_phase_write_ = false;
+
+  // This must be the last member.
+  base::WeakPtrFactory<Stream> weak_factory_{this};
+};
+
 QuicTransport::QuicTransport(
     const GURL& url,
     const url::Origin& origin,
@@ -53,6 +283,71 @@
   std::move(callback).Run(result.status == quic::MESSAGE_STATUS_SUCCESS);
 }
 
+void QuicTransport::CreateStream(
+    mojo::ScopedDataPipeConsumerHandle readable,
+    mojo::ScopedDataPipeProducerHandle writable,
+    base::OnceCallback<void(bool, uint32_t)> callback) {
+  // |readable| is non-nullable, |writable| is nullable.
+  DCHECK(readable);
+
+  if (handshake_client_) {
+    // Invalid request.
+    std::move(callback).Run(false, 0);
+    return;
+  }
+
+  quic::QuicTransportClientSession* const session = transport_->session();
+
+  if (writable) {
+    // Bidirectional
+    if (!session->CanOpenNextOutgoingBidirectionalStream()) {
+      // TODO(crbug.com/104236): Instead of rejecting the creation request, we
+      // should wait in this case.
+      std::move(callback).Run(false, 0);
+      return;
+    }
+    quic::QuicTransportStream* const stream =
+        session->OpenOutgoingBidirectionalStream();
+    DCHECK(stream);
+    streams_.insert(std::make_pair(
+        stream->id(),
+        std::make_unique<Stream>(this, stream, std::move(readable),
+                                 std::move(writable))));
+    std::move(callback).Run(true, stream->id());
+    return;
+  }
+
+  // Unidirectional
+  if (!session->CanOpenNextOutgoingUnidirectionalStream()) {
+    // TODO(crbug.com/104236): Instead of rejecting the creation request, we
+    // should wait in this case.
+    std::move(callback).Run(false, 0);
+    return;
+  }
+
+  quic::QuicTransportStream* const stream =
+      session->OpenOutgoingUnidirectionalStream();
+  DCHECK(stream);
+  streams_.insert(std::make_pair(
+      stream->id(),
+      std::make_unique<Stream>(this, stream, std::move(readable))));
+  std::move(callback).Run(true, stream->id());
+}
+
+void QuicTransport::AcceptBidirectionalStream(
+    BidirectionalStreamAcceptanceCallback acceptance) {
+  bidirectional_stream_acceptances_.push(std::move(acceptance));
+
+  OnIncomingBidirectionalStreamAvailable();
+}
+
+void QuicTransport::AcceptUnidirectionalStream(
+    UnidirectionalStreamAcceptanceCallback acceptance) {
+  unidirectional_stream_acceptances_.push(std::move(acceptance));
+
+  OnIncomingUnidirectionalStreamAvailable();
+}
+
 void QuicTransport::OnConnected() {
   if (torn_down_) {
     return;
@@ -101,9 +396,79 @@
   TearDown();
 }
 
-void QuicTransport::OnIncomingBidirectionalStreamAvailable() {}
+void QuicTransport::OnIncomingBidirectionalStreamAvailable() {
+  DCHECK(!handshake_client_);
+  DCHECK(client_);
 
-void QuicTransport::OnIncomingUnidirectionalStreamAvailable() {}
+  while (!bidirectional_stream_acceptances_.empty()) {
+    quic::QuicTransportStream* const stream =
+        transport_->session()->AcceptIncomingBidirectionalStream();
+    if (!stream) {
+      return;
+    }
+    auto acceptance = std::move(bidirectional_stream_acceptances_.front());
+    bidirectional_stream_acceptances_.pop();
+
+    mojo::ScopedDataPipeConsumerHandle readable_for_outgoing;
+    mojo::ScopedDataPipeProducerHandle writable_for_outgoing;
+    mojo::ScopedDataPipeConsumerHandle readable_for_incoming;
+    mojo::ScopedDataPipeProducerHandle writable_for_incoming;
+    const MojoCreateDataPipeOptions options = {
+        sizeof(options), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1, 256 * 1024};
+    if (mojo::CreateDataPipe(&options, &writable_for_outgoing,
+                             &readable_for_outgoing) != MOJO_RESULT_OK) {
+      transport_->session()->CloseStream(stream->id());
+      // TODO(yhirano): Error the entire connection.
+      return;
+    }
+    if (mojo::CreateDataPipe(&options, &writable_for_incoming,
+                             &readable_for_incoming) != MOJO_RESULT_OK) {
+      transport_->session()->CloseStream(stream->id());
+      // TODO(yhirano): Error the entire connection.
+      return;
+    }
+
+    streams_.insert(std::make_pair(
+        stream->id(),
+        std::make_unique<Stream>(this, stream, std::move(readable_for_outgoing),
+                                 std::move(writable_for_incoming))));
+    std::move(acceptance)
+        .Run(stream->id(), std::move(readable_for_incoming),
+             std::move(writable_for_outgoing));
+  }
+}
+
+void QuicTransport::OnIncomingUnidirectionalStreamAvailable() {
+  DCHECK(!handshake_client_);
+  DCHECK(client_);
+
+  while (!unidirectional_stream_acceptances_.empty()) {
+    quic::QuicTransportStream* const stream =
+        transport_->session()->AcceptIncomingUnidirectionalStream();
+
+    if (!stream) {
+      return;
+    }
+    auto acceptance = std::move(unidirectional_stream_acceptances_.front());
+    unidirectional_stream_acceptances_.pop();
+
+    mojo::ScopedDataPipeConsumerHandle readable_for_incoming;
+    mojo::ScopedDataPipeProducerHandle writable_for_incoming;
+    const MojoCreateDataPipeOptions options = {
+        sizeof(options), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1, 256 * 1024};
+    if (mojo::CreateDataPipe(&options, &writable_for_incoming,
+                             &readable_for_incoming) != MOJO_RESULT_OK) {
+      transport_->session()->CloseStream(stream->id());
+      // TODO(yhirano): Error the entire connection.
+      return;
+    }
+
+    streams_.insert(std::make_pair(
+        stream->id(), std::make_unique<Stream>(
+                          this, stream, std::move(writable_for_incoming))));
+    std::move(acceptance).Run(stream->id(), std::move(readable_for_incoming));
+  }
+}
 
 void QuicTransport::TearDown() {
   torn_down_ = true;
@@ -117,6 +482,8 @@
 }
 
 void QuicTransport::Dispose() {
+  receiver_.reset();
+
   context_->Remove(this);
   // |this| is deleted.
 }
diff --git a/services/network/quic_transport.h b/services/network/quic_transport.h
index 36a45dd2..8023bbf 100644
--- a/services/network/quic_transport.h
+++ b/services/network/quic_transport.h
@@ -6,6 +6,8 @@
 #define SERVICES_NETWORK_QUIC_TRANSPORT_H_
 
 #include <memory>
+
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -34,6 +36,13 @@
     : public mojom::QuicTransport,
       public net::QuicTransportClient::Visitor {
  public:
+  class Stream;
+  using BidirectionalStreamAcceptanceCallback =
+      base::OnceCallback<void(uint32_t,
+                              mojo::ScopedDataPipeConsumerHandle,
+                              mojo::ScopedDataPipeProducerHandle)>;
+  using UnidirectionalStreamAcceptanceCallback =
+      base::OnceCallback<void(uint32_t, mojo::ScopedDataPipeConsumerHandle)>;
   QuicTransport(const GURL& url,
                 const url::Origin& origin,
                 const net::NetworkIsolationKey& key,
@@ -45,6 +54,13 @@
   // mojom::QuicTransport implementation:
   void SendDatagram(base::span<const uint8_t> data,
                     base::OnceCallback<void(bool)> callback) override;
+  void CreateStream(mojo::ScopedDataPipeConsumerHandle readable,
+                    mojo::ScopedDataPipeProducerHandle writable,
+                    base::OnceCallback<void(bool, uint32_t)> callback) override;
+  void AcceptBidirectionalStream(
+      BidirectionalStreamAcceptanceCallback callback) override;
+  void AcceptUnidirectionalStream(
+      UnidirectionalStreamAcceptanceCallback callback) override;
 
   // net::QuicTransportClient::Visitor implementation:
   void OnConnected() override;
@@ -63,10 +79,17 @@
   const std::unique_ptr<net::QuicTransportClient> transport_;
   NetworkContext* const context_;  // outlives |this|.
 
+  std::map<uint32_t, std::unique_ptr<Stream>> streams_;
+
   mojo::Receiver<mojom::QuicTransport> receiver_;
   mojo::Remote<mojom::QuicTransportHandshakeClient> handshake_client_;
   mojo::Remote<mojom::QuicTransportClient> client_;
 
+  base::queue<BidirectionalStreamAcceptanceCallback>
+      bidirectional_stream_acceptances_;
+  base::queue<UnidirectionalStreamAcceptanceCallback>
+      unidirectional_stream_acceptances_;
+
   bool torn_down_ = false;
 
   // This must be the last member.
diff --git a/services/network/quic_transport_unittest.cc b/services/network/quic_transport_unittest.cc
index 26e1d0fc..aa59685a 100644
--- a/services/network/quic_transport_unittest.cc
+++ b/services/network/quic_transport_unittest.cc
@@ -20,6 +20,26 @@
 namespace network {
 namespace {
 
+// We don't use mojo::BlockingCopyToString because it leads to deadlocks.
+std::string Read(mojo::ScopedDataPipeConsumerHandle readable) {
+  std::string output;
+  while (true) {
+    char buffer[1024];
+    uint32_t size = sizeof(buffer);
+    MojoResult result =
+        readable->ReadData(buffer, &size, MOJO_READ_DATA_FLAG_NONE);
+    if (result == MOJO_RESULT_SHOULD_WAIT) {
+      base::RunLoop().RunUntilIdle();
+      continue;
+    }
+    if (result == MOJO_RESULT_FAILED_PRECONDITION) {
+      return output;
+    }
+    DCHECK_EQ(result, MOJO_RESULT_OK);
+    output.append(buffer, size);
+  }
+}
+
 class TestHandshakeClient final : public mojom::QuicTransportHandshakeClient {
  public:
   TestHandshakeClient(mojo::PendingReceiver<mojom::QuicTransportHandshakeClient>
@@ -244,5 +264,120 @@
   EXPECT_FALSE(result);
 }
 
+TEST_F(QuicTransportTest, EchoOnUnidirectionalStreams) {
+  base::RunLoop run_loop_for_handshake;
+  mojo::PendingRemote<mojom::QuicTransportHandshakeClient> handshake_client;
+  TestHandshakeClient test_handshake_client(
+      handshake_client.InitWithNewPipeAndPassReceiver(),
+      run_loop_for_handshake.QuitClosure());
+
+  CreateQuicTransport(GetURL("/echo"),
+                      url::Origin::Create(GURL("https://example.org/")),
+                      std::move(handshake_client));
+
+  run_loop_for_handshake.Run();
+
+  ASSERT_TRUE(test_handshake_client.has_seen_connection_establishment());
+
+  mojo::Remote<mojom::QuicTransport> transport_remote(
+      test_handshake_client.PassTransport());
+
+  mojo::ScopedDataPipeConsumerHandle readable_for_outgoing;
+  mojo::ScopedDataPipeProducerHandle writable_for_outgoing;
+  const MojoCreateDataPipeOptions options = {
+      sizeof(options), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1, 4 * 1024};
+  ASSERT_EQ(MOJO_RESULT_OK,
+            mojo::CreateDataPipe(&options, &writable_for_outgoing,
+                                 &readable_for_outgoing));
+  uint32_t size = 5;
+  ASSERT_EQ(MOJO_RESULT_OK, writable_for_outgoing->WriteData(
+                                "hello", &size, MOJO_WRITE_DATA_FLAG_NONE));
+  // Signal the end-of-data.
+  writable_for_outgoing.reset();
+
+  base::RunLoop run_loop_for_stream_creation;
+  uint32_t stream_id;
+  bool stream_created;
+  transport_remote->CreateStream(
+      std::move(readable_for_outgoing),
+      /*writable=*/{}, base::BindLambdaForTesting([&](bool b, uint32_t id) {
+        stream_created = b;
+        stream_id = id;
+        run_loop_for_stream_creation.Quit();
+      }));
+  run_loop_for_stream_creation.Run();
+  ASSERT_TRUE(stream_created);
+
+  mojo::ScopedDataPipeConsumerHandle readable_for_incoming;
+  uint32_t incoming_stream_id = stream_id;
+  base::RunLoop run_loop_for_incoming_stream;
+  transport_remote->AcceptUnidirectionalStream(base::BindLambdaForTesting(
+      [&](uint32_t id, mojo::ScopedDataPipeConsumerHandle readable) {
+        incoming_stream_id = id;
+        readable_for_incoming = std::move(readable);
+        run_loop_for_incoming_stream.Quit();
+      }));
+
+  run_loop_for_incoming_stream.Run();
+  ASSERT_TRUE(readable_for_incoming);
+  EXPECT_NE(stream_id, incoming_stream_id);
+
+  std::string echo_back = Read(std::move(readable_for_incoming));
+  EXPECT_EQ("hello", echo_back);
+}
+
+TEST_F(QuicTransportTest, EchoOnBidirectionalStream) {
+  base::RunLoop run_loop_for_handshake;
+  mojo::PendingRemote<mojom::QuicTransportHandshakeClient> handshake_client;
+  TestHandshakeClient test_handshake_client(
+      handshake_client.InitWithNewPipeAndPassReceiver(),
+      run_loop_for_handshake.QuitClosure());
+
+  CreateQuicTransport(GetURL("/echo"),
+                      url::Origin::Create(GURL("https://example.org/")),
+                      std::move(handshake_client));
+
+  run_loop_for_handshake.Run();
+
+  ASSERT_TRUE(test_handshake_client.has_seen_connection_establishment());
+
+  mojo::Remote<mojom::QuicTransport> transport_remote(
+      test_handshake_client.PassTransport());
+
+  mojo::ScopedDataPipeConsumerHandle readable_for_outgoing;
+  mojo::ScopedDataPipeProducerHandle writable_for_outgoing;
+  mojo::ScopedDataPipeConsumerHandle readable_for_incoming;
+  mojo::ScopedDataPipeProducerHandle writable_for_incoming;
+  const MojoCreateDataPipeOptions options = {
+      sizeof(options), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1, 4 * 1024};
+  ASSERT_EQ(MOJO_RESULT_OK,
+            mojo::CreateDataPipe(&options, &writable_for_outgoing,
+                                 &readable_for_outgoing));
+  ASSERT_EQ(MOJO_RESULT_OK,
+            mojo::CreateDataPipe(&options, &writable_for_incoming,
+                                 &readable_for_incoming));
+  uint32_t size = 5;
+  ASSERT_EQ(MOJO_RESULT_OK, writable_for_outgoing->WriteData(
+                                "hello", &size, MOJO_WRITE_DATA_FLAG_NONE));
+  // Signal the end-of-data.
+  writable_for_outgoing.reset();
+
+  base::RunLoop run_loop_for_stream_creation;
+  uint32_t stream_id;
+  bool stream_created;
+  transport_remote->CreateStream(
+      std::move(readable_for_outgoing), std::move(writable_for_incoming),
+      base::BindLambdaForTesting([&](bool b, uint32_t id) {
+        stream_created = b;
+        stream_id = id;
+        run_loop_for_stream_creation.Quit();
+      }));
+  run_loop_for_stream_creation.Run();
+  ASSERT_TRUE(stream_created);
+
+  std::string echo_back = Read(std::move(readable_for_incoming));
+  EXPECT_EQ("hello", echo_back);
+}
+
 }  // namespace
 }  // namespace network
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index cb12847..d4c26a3c 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -202,8 +202,7 @@
           "--additional-expectations=../../third_party/blink/web_tests/WebGPUExpectations",
           "--isolated-script-test-filter=wpt_internal/webgpu/*",
           "--no-xvfb",
-          "--additional-driver-flag=--disable-gpu-sandbox",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--disable-gpu-sandbox"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -426,8 +425,7 @@
           "--additional-expectations=../../third_party/blink/web_tests/WebGPUExpectations",
           "--isolated-script-test-filter=wpt_internal/webgpu/*",
           "--no-xvfb",
-          "--additional-driver-flag=--disable-gpu-sandbox",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--disable-gpu-sandbox"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 44331b19b..3e5c797 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -124,7 +124,8 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--disable-features=UseSkiaRenderer",
+          "--additional-driver-flag=--enable-features=UseSkiaRenderer",
+          "--fuzzy-diff",
           "--skipped=always",
           "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
         ],
@@ -135,7 +136,7 @@
           ],
           "script": "//third_party/blink/tools/merge_web_test_results.py"
         },
-        "name": "non_skia_renderer_swiftshader_blink_web_tests",
+        "name": "skia_renderer_swiftshader_blink_web_tests",
         "results_handler": "layout tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2610,8 +2611,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--enable-blink-features=CompositeAfterPaint",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--enable-blink-features=CompositeAfterPaint"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -2664,8 +2664,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--disable-blink-features=LayoutNG",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--disable-blink-features=LayoutNG"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -14711,8 +14710,7 @@
           "--num-retries=3",
           "--debug",
           "--additional-driver-flag=--enable-features=BackForwardCache",
-          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=BackForwardCache",
-          "--fuzzy-diff"
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=BackForwardCache"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -15439,8 +15437,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--debug",
-          "--fuzzy-diff"
+          "--debug"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -15613,8 +15610,7 @@
         "args": [
           "--num-retries=3",
           "--additional-driver-flag=--disable-features=OutOfBlinkCors",
-          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/disable-features=OutOfBlinkCors",
-          "--fuzzy-diff"
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/disable-features=OutOfBlinkCors"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -17209,8 +17205,7 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--fuzzy-diff"
+          "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -20394,38 +20389,11 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--additional-driver-flag=--disable-features=UseSkiaRenderer",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "non_skia_renderer_swiftshader_blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ]
-        },
-        "test_target": "//:blink_web_tests"
-      },
-      {
-        "args": [
           "--additional-driver-flag",
           "--disable-site-isolation-trials",
           "--additional-expectations",
           "src/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials",
-          "--num-retries=3",
-          "--fuzzy-diff"
+          "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -20448,6 +20416,33 @@
         "test_target": "//:blink_web_tests"
       },
       {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--enable-features=UseSkiaRenderer",
+          "--fuzzy-diff",
+          "--skipped=always",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "skia_renderer_swiftshader_blink_web_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ]
+        },
+        "test_target": "//:blink_web_tests"
+      },
+      {
         "isolate_name": "telemetry_gpu_unittests",
         "merge": {
           "args": [],
@@ -22279,41 +22274,12 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--additional-driver-flag=--disable-features=UseSkiaRenderer",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
-        ],
-        "isolate_coverage_data": true,
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "non_skia_renderer_swiftshader_blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ]
-        },
-        "test_target": "//:blink_web_tests"
-      },
-      {
-        "args": [
           "--additional-driver-flag",
           "--disable-site-isolation-trials",
           "--additional-expectations",
           "src/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials",
           "--num-retries=3",
-          "--fuzzy-diff",
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-          "--fuzzy-diff"
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
         "isolate_coverage_data": true,
         "isolate_name": "blink_web_tests",
@@ -22337,6 +22303,34 @@
         "test_target": "//:blink_web_tests"
       },
       {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--enable-features=UseSkiaRenderer",
+          "--fuzzy-diff",
+          "--skipped=always",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
+        ],
+        "isolate_coverage_data": true,
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "skia_renderer_swiftshader_blink_web_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ]
+        },
+        "test_target": "//:blink_web_tests"
+      },
+      {
         "isolate_coverage_data": true,
         "isolate_name": "telemetry_gpu_unittests",
         "merge": {
@@ -22483,8 +22477,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-          "--fuzzy-diff"
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
         "isolate_coverage_data": true,
         "isolate_name": "blink_web_tests",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 4166081..8b37f12 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -4112,41 +4112,12 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--additional-driver-flag=--disable-features=UseSkiaRenderer",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
-        ],
-        "isolate_coverage_data": true,
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "non_skia_renderer_swiftshader_blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ]
-        },
-        "test_target": "//:blink_web_tests"
-      },
-      {
-        "args": [
           "--additional-driver-flag",
           "--disable-site-isolation-trials",
           "--additional-expectations",
           "src/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials",
           "--num-retries=3",
-          "--fuzzy-diff",
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-          "--fuzzy-diff"
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
         "isolate_coverage_data": true,
         "isolate_name": "blink_web_tests",
@@ -4170,6 +4141,34 @@
         "test_target": "//:blink_web_tests"
       },
       {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--enable-features=UseSkiaRenderer",
+          "--fuzzy-diff",
+          "--skipped=always",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
+        ],
+        "isolate_coverage_data": true,
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "skia_renderer_swiftshader_blink_web_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ]
+        },
+        "test_target": "//:blink_web_tests"
+      },
+      {
         "isolate_coverage_data": true,
         "isolate_name": "telemetry_gpu_unittests",
         "merge": {
@@ -4299,8 +4298,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-          "--fuzzy-diff"
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
         "isolate_coverage_data": true,
         "isolate_name": "blink_web_tests",
@@ -6011,8 +6009,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--debug",
-          "--fuzzy-diff"
+          "--debug"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -7775,38 +7772,11 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--additional-driver-flag=--disable-features=UseSkiaRenderer",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "non_skia_renderer_swiftshader_blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-14.04"
-            }
-          ]
-        },
-        "test_target": "//:blink_web_tests"
-      },
-      {
-        "args": [
           "--additional-driver-flag",
           "--disable-site-isolation-trials",
           "--additional-expectations",
           "src/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials",
-          "--num-retries=3",
-          "--fuzzy-diff"
+          "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -7829,6 +7799,33 @@
         "test_target": "//:blink_web_tests"
       },
       {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--enable-features=UseSkiaRenderer",
+          "--fuzzy-diff",
+          "--skipped=always",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "skia_renderer_swiftshader_blink_web_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-14.04"
+            }
+          ]
+        },
+        "test_target": "//:blink_web_tests"
+      },
+      {
         "isolate_name": "telemetry_gpu_unittests",
         "merge": {
           "args": [],
@@ -7972,8 +7969,7 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--fuzzy-diff"
+          "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 1bf44533..e1828b65 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -14198,8 +14198,7 @@
           "../../third_party/blink/web_tests/ASANExpectations",
           "--time-out-ms",
           "48000",
-          "--enable-sanitizer",
-          "--fuzzy-diff"
+          "--enable-sanitizer"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -14232,8 +14231,7 @@
           "../../third_party/blink/web_tests/LeakExpectations",
           "--time-out-ms",
           "48000",
-          "--enable-leak-detection",
-          "--fuzzy-diff"
+          "--enable-leak-detection"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -14266,8 +14264,7 @@
           "../../third_party/blink/web_tests/MSANExpectations",
           "--time-out-ms",
           "66000",
-          "--enable-sanitizer",
-          "--fuzzy-diff"
+          "--enable-sanitizer"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index 2622a53c..1c11217 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -1072,17 +1072,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "vr_pixeltests",
-        "test_target": "//chrome/browser/vr:vr_pixeltests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "weblayer_browsertests",
         "test_target": "//weblayer/test:weblayer_browsertests"
       },
@@ -8496,17 +8485,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "vr_pixeltests",
-        "test_target": "//chrome/browser/vr:vr_pixeltests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "weblayer_browsertests",
         "test_target": "//weblayer/test:weblayer_browsertests"
       },
@@ -9824,17 +9802,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "vr_pixeltests",
-        "test_target": "//chrome/browser/vr:vr_pixeltests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "weblayer_browsertests",
         "test_target": "//weblayer/test:weblayer_browsertests"
       },
diff --git a/testing/buildbot/client.devtools-frontend.integration.json b/testing/buildbot/client.devtools-frontend.integration.json
index d2f4ad5..d9a35b7 100644
--- a/testing/buildbot/client.devtools-frontend.integration.json
+++ b/testing/buildbot/client.devtools-frontend.integration.json
@@ -53,8 +53,7 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--fuzzy-diff"
+          "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 5e6754de..a13111e 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1303,8 +1303,7 @@
     "isolated_scripts": [
       {
         "args": [
-          "--num-retries=3",
-          "--fuzzy-diff"
+          "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -1355,8 +1354,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--debug",
-          "--fuzzy-diff"
+          "--debug"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -1407,8 +1405,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--js-flags=--future",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--js-flags=--future"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 98d4a16..c4c8562c 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1280,13 +1280,11 @@
       'Linux Tests': {
         "args": [
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-          "--fuzzy-diff",
         ],
       },
       'linux-code-coverage': {
         'args': [
           '--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'shards': 20,
@@ -1740,6 +1738,12 @@
       'android-pie-x86-fyi-rel',
       'VR Linux',
       'android-code-coverage-native', # crbug/1018431
+      # These tests fail on Win7, and given that We don't support VR there,
+      # these tests are unnecessary there.
+      # chromium.win
+      'Win 7 Tests x64 (1)',
+      'Win7 Tests (1)',
+      'Win7 Tests (dbg)(1)',
     ],
   },
   'wayland_client_perftests': {
@@ -1838,12 +1842,6 @@
       'Win10 Tests x64 (dbg)',
     ],
     'modifications': {
-      # devtools-frontend
-      'DevTools Linux': {
-        'args': [
-          '--fuzzy-diff',
-        ],
-      },
       'Fuchsia x64': {
         'args': [
           '--platform=fuchsia',
@@ -1855,13 +1853,11 @@
       'Linux Tests': {
         "args": [
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-          "--fuzzy-diff",
         ],
       },
       'Linux Tests (dbg)(1)': {
         'args': [
           '--debug',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'shards': 20,
@@ -1913,21 +1909,14 @@
           '--debug',
         ],
       },
-      'V8 Blink Linux': {
-        'args': [
-          '--fuzzy-diff',
-        ],
-      },
       'V8 Blink Linux Debug': {
         'args': [
           '--debug',
-          '--fuzzy-diff',
         ],
       },
       'V8 Blink Linux Future': {
         'args': [
           '--additional-driver-flag=--js-flags=--future',
-          '--fuzzy-diff',
         ],
       },
       'WebKit Linux ASAN': {
@@ -1937,7 +1926,6 @@
           '--time-out-ms',
           '48000',
           '--enable-sanitizer',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'shards': 20,
@@ -1950,7 +1938,6 @@
           '--time-out-ms',
           '48000',
           '--enable-leak-detection',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'shards': 10,
@@ -1963,7 +1950,6 @@
           '--time-out-ms',
           '66000',
           '--enable-sanitizer',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'expiration': 36000,
@@ -1975,13 +1961,11 @@
       'WebKit Linux composite_after_paint Dummy Builder': {
         'args': [
           '--additional-driver-flag=--enable-blink-features=CompositeAfterPaint',
-          '--fuzzy-diff',
         ],
       },
       'WebKit Linux layout_ng_disabled Builder': {
         'args': [
           '--additional-driver-flag=--disable-blink-features=LayoutNG',
-          '--fuzzy-diff',
         ],
       },
       'Win10 Tests x64': {
@@ -2038,7 +2022,6 @@
       'devtools_frontend_linux_blink_light_rel': {
         'args': [
           'http/tests/devtools',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'shards': 4,
@@ -2057,38 +2040,28 @@
           '--debug',
           '--additional-driver-flag=--enable-features=BackForwardCache',
           '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=BackForwardCache',
-          '--fuzzy-diff',
         ],
       },
       'linux-blink-animation-use-time-delta': {
         'args': [
           '--debug',
-          '--fuzzy-diff',
         ],
       },
       'linux-blink-cors-rel': {
         'args': [
           '--additional-driver-flag=--disable-features=OutOfBlinkCors',
           '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/disable-features=OutOfBlinkCors',
-          '--fuzzy-diff',
         ],
       },
       'linux-blink-heap-concurrent-marking-tsan-rel': {
         'args': [
           '--release',
           '--additional-driver-flag=--enable-features=BlinkHeapConcurrentMarking',
-          '--fuzzy-diff',
-        ],
-      },
-      'linux-blink-rel-dummy': {
-        'args': [
-          '--fuzzy-diff',
         ],
       },
       'linux-code-coverage': {
         'args': [
           '--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw',
-          '--fuzzy-diff',
         ],
         'swarming': {
           'shards': 20,
@@ -2097,18 +2070,11 @@
       'linux-layout-tests-fragment-item': {
         'args': [
           '--additional-driver-flag=--enable-blink-features=LayoutNGFragmentItem',
-          '--fuzzy-diff',
         ],
       },
       'linux-layout-tests-fragment-paint': {
         'args': [
           '--additional-driver-flag=--enable-blink-features=LayoutNGFragmentPaint',
-          '--fuzzy-diff',
-        ],
-      },
-      'linux-trusty-rel': {
-        'args': [
-          '--fuzzy-diff',
         ],
       },
       'mac10.10-blink-rel-dummy': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 4cfbc7e..3afd653 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -926,7 +926,6 @@
         'args': [
           '--num-retries=3',
         ],
-        'linux_args': [ '--fuzzy-diff', ],
         'isolate_name': 'blink_web_tests',
         'merge': {
           'args': [
@@ -949,7 +948,6 @@
         'args': [
           '--num-retries=3',
         ],
-        'linux_args': [ '--fuzzy-diff', ],
         'isolate_name': 'blink_web_tests',
         'merge': {
           'args': [
@@ -1137,7 +1135,6 @@
         'args': [
           '--num-retries=3',
         ],
-        'linux_args': [ '--fuzzy-diff', ],
         'isolate_name': 'blink_web_tests',
         'merge': {
           'args': [
@@ -2533,7 +2530,6 @@
         'linux_args': [
           '--no-xvfb',
           '--additional-driver-flag=--disable-gpu-sandbox',
-          '--fuzzy-diff',
         ],
         'merge': {
           'args': [
@@ -2676,7 +2672,6 @@
           # passed, but 0 times when '--test-list' is passed. We want to always
           # retry 3 times, so we explicitly specify it.
           '--num-retries=3',
-          '--fuzzy-diff',
         ],
         'isolate_name': 'blink_web_tests',
         'merge': {
@@ -3126,13 +3121,14 @@
     },
 
     'skia_renderer_isolated_scripts': {
-      'non_skia_renderer_swiftshader_blink_web_tests': {
+      'skia_renderer_swiftshader_blink_web_tests': {
         # layout test failures are retried 3 times when '--test-list' is not
         # passed, but 0 times when '--test-list' is passed. We want to always
         # retry 3 times, so we explicitly specify it.
         'args': [
           '--num-retries=3',
-          '--additional-driver-flag=--disable-features=UseSkiaRenderer',
+          '--additional-driver-flag=--enable-features=UseSkiaRenderer',
+          '--fuzzy-diff',
           '--skipped=always',
           '--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter',
         ],
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json
index 55a29c0..a235dff 100644
--- a/testing/buildbot/tryserver.chromium.linux.json
+++ b/testing/buildbot/tryserver.chromium.linux.json
@@ -9,8 +9,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--enable-blink-features=LayoutNGFragmentItem",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--enable-blink-features=LayoutNGFragmentItem"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
@@ -42,8 +41,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--enable-blink-features=LayoutNGFragmentPaint",
-          "--fuzzy-diff"
+          "--additional-driver-flag=--enable-blink-features=LayoutNGFragmentPaint"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/buildbot/tryserver.devtools-frontend.json b/testing/buildbot/tryserver.devtools-frontend.json
index c326419..805c3ba 100644
--- a/testing/buildbot/tryserver.devtools-frontend.json
+++ b/testing/buildbot/tryserver.devtools-frontend.json
@@ -32,8 +32,7 @@
       {
         "args": [
           "--num-retries=3",
-          "http/tests/devtools",
-          "--fuzzy-diff"
+          "http/tests/devtools"
         ],
         "isolate_name": "blink_web_tests",
         "merge": {
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py
index 7990b39..f367eed 100755
--- a/testing/scripts/run_performance_tests.py
+++ b/testing/scripts/run_performance_tests.py
@@ -282,8 +282,13 @@
           command, env, stdoutfile=output_paths.logs)
     else:
       with open(output_paths.logs, 'w') as handle:
-        return_code = test_env.run_command_output_to_handle(
-            command, handle, env=env)
+        try:
+          return_code = test_env.run_command_output_to_handle(
+              command, handle, env=env)
+        except OSError as e:
+          print('Command to run gtest perf test %s failed with an OSError: %s' %
+                e)
+          return_code = 1
     if not os.path.exists(output_paths.perf_results):
       # Get the correct json format from the stdout to write to the perf
       # results file if gtest does not generate one.
@@ -296,12 +301,17 @@
   except Exception:
     traceback.print_exc()
     return_code = 1
-  if command_generator.executable_name in GTEST_CONVERSION_WHITELIST:
-    with path_util.SysPath(path_util.GetTracingDir()):
-      # pylint: disable=no-name-in-module
-      from tracing.value import gtest_json_converter
-      # pylint: enable=no-name-in-module
-    gtest_json_converter.ConvertGtestJsonFile(output_paths.perf_results)
+  if os.path.exists(output_paths.perf_results):
+    if command_generator.executable_name in GTEST_CONVERSION_WHITELIST:
+      with path_util.SysPath(path_util.GetTracingDir()):
+        # pylint: disable=no-name-in-module
+        from tracing.value import gtest_json_converter
+        # pylint: enable=no-name-in-module
+      gtest_json_converter.ConvertGtestJsonFile(output_paths.perf_results)
+  else:
+    print('ERROR: gtest perf test %s did not generate perf output' %
+          output_paths.name)
+    return_code = 1
   write_simple_test_results(return_code, output_paths.test_results,
                             output_paths.name)
   return return_code
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 0e185ce..6ed6769 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -567,24 +567,6 @@
             ]
         }
     ],
-    "AndroidWideColorGamut": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "UseDisplayWideColorGamut",
-                    "params": {
-                        "enabled_models": "Pixel 4,Pixel 4 XL"
-                    },
-                    "enable_features": [
-                        "UseDisplayWideColorGamut"
-                    ]
-                }
-            ]
-        }
-    ],
     "AppLauncherRefresh": [
         {
             "platforms": [
@@ -792,6 +774,22 @@
             ]
         }
     ],
+    "AutofillCreditCardAuthentication": [
+        {
+            "platforms": [
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutofillCreditCardAuthentication"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillDynamicForms": [
         {
             "platforms": [
@@ -5988,9 +5986,8 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_All",
+                    "name": "Enabled_Ui_Ps3",
                     "enable_features": [
-                        "OffMainThreadServiceWorkerStartup",
                         "ServiceWorkerOnUI",
                         "ServiceWorkerPrefersUnusedProcess"
                     ]
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 9c785b13..07626a8 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -159,7 +159,6 @@
     "platform/user_metrics_action.h",
     "platform/viewport_intersection_state.h",
     "platform/web_audio_bus.h",
-    "platform/web_audio_destination_consumer.h",
     "platform/web_audio_device.h",
     "platform/web_audio_latency_hint.h",
     "platform/web_audio_source_provider.h",
diff --git a/third_party/blink/renderer/core/dom/element_traversal.h b/third_party/blink/renderer/core/dom/element_traversal.h
index bf83858a..1754eba 100644
--- a/third_party/blink/renderer/core/dom/element_traversal.h
+++ b/third_party/blink/renderer/core/dom/element_traversal.h
@@ -131,6 +131,13 @@
   }
   template <typename MatchFunc>
   static ElementType* FirstWithin(const ContainerNode&, MatchFunc);
+
+  static ElementType* InclusiveFirstWithin(Node& current) {
+    if (IsElementOfType<const ElementType>(current))
+      return To<ElementType>(&current);
+    return FirstWithin(current);
+  }
+
   static ElementType* LastWithin(const ContainerNode& current) {
     return LastWithinTemplate(current);
   }
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 7f19424..6b549cb 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -2907,13 +2907,6 @@
                                           event_options, scope);
 }
 
-void Node::DispatchInputEvent() {
-  // Legacy 'input' event for forms set value and checked.
-  Event* event = Event::CreateBubble(event_type_names::kInput);
-  event->SetComposed(true);
-  DispatchScopedEvent(*event);
-}
-
 void Node::DefaultEventHandler(Event& event) {
   if (event.target() != this)
     return;
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index bb5906e6..8e756c96a 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -853,8 +853,6 @@
                               SimulatedClickCreationScope =
                                   SimulatedClickCreationScope::kFromUserAgent);
 
-  void DispatchInputEvent();
-
   // Perform the default action for an event.
   virtual void DefaultEventHandler(Event&);
   void UpdateHadKeyboardEvent(const Event&);
diff --git a/third_party/blink/renderer/core/editing/editor.cc b/third_party/blink/renderer/core/editing/editor.cc
index b0f6636e7..52942050 100644
--- a/third_party/blink/renderer/core/editing/editor.cc
+++ b/third_party/blink/renderer/core/editing/editor.cc
@@ -634,13 +634,13 @@
 
 void Editor::SetBaseWritingDirection(WritingDirection direction) {
   Element* focused_element = GetFrame().GetDocument()->FocusedElement();
-  if (IsTextControl(focused_element)) {
+  if (auto* text_control = ToTextControlOrNull(focused_element)) {
     if (direction == WritingDirection::kNatural)
       return;
-    focused_element->setAttribute(
+    text_control->setAttribute(
         html_names::kDirAttr,
         direction == WritingDirection::kLeftToRight ? "ltr" : "rtl");
-    focused_element->DispatchInputEvent();
+    text_control->DispatchInputEvent();
     return;
   }
 
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index 1204ae26..faca1baab 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -243,10 +243,6 @@
     formOwner()->InvalidateDefaultButtonStyle();
 }
 
-void HTMLFormControlElement::DispatchChangeEvent() {
-  DispatchScopedEvent(*Event::CreateBubble(event_type_names::kChange));
-}
-
 HTMLFormElement* HTMLFormControlElement::formOwner() const {
   return ListedElement::Form();
 }
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index e8532a2..859d6e9f 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -59,8 +59,6 @@
 
   void Reset();
 
-  void DispatchChangeEvent();
-
   HTMLFormElement* formOwner() const final;
 
   bool IsDisabledFormControl() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
index 473e952a5..7aa11b0 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
@@ -24,6 +24,7 @@
 
 #include "third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h"
 
+#include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/html/forms/html_form_element.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
 
@@ -286,6 +287,17 @@
                 WrapWeakPersistent(this)));
 }
 
+void HTMLFormControlElementWithState::DispatchInputEvent() {
+  // Legacy 'input' event for forms set value and checked.
+  Event* event = Event::CreateBubble(event_type_names::kInput);
+  event->SetComposed(true);
+  DispatchScopedEvent(*event);
+}
+
+void HTMLFormControlElementWithState::DispatchChangeEvent() {
+  DispatchScopedEvent(*Event::CreateBubble(event_type_names::kChange));
+}
+
 void HTMLFormControlElementWithState::FinishParsingChildren() {
   HTMLFormControlElement::FinishParsingChildren();
   ListedElement::TakeStateAndRestore();
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
index 196b6bc7..4c5f5b8 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
@@ -50,6 +50,9 @@
   // This is only used in tests, to fake the user's action
   void SetUserHasEditedTheFieldForTest() { user_has_edited_the_field_ = true; }
 
+  void DispatchInputEvent();
+  void DispatchChangeEvent();
+
  protected:
   bool user_has_edited_the_field_ = false;
   HTMLFormControlElementWithState(const QualifiedName& tag_name, Document&);
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index c3ebbea..bad6851 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -982,6 +982,7 @@
   if (checked() == now_checked)
     return;
 
+  input_type_->WillUpdateCheckedness(now_checked);
   is_checked_ = now_checked;
 
   if (RadioButtonGroupScope* scope = GetRadioButtonGroupScope())
diff --git a/third_party/blink/renderer/core/html/forms/input_type.cc b/third_party/blink/renderer/core/html/forms/input_type.cc
index 12d58a3f..8a47c143 100644
--- a/third_party/blink/renderer/core/html/forms/input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/input_type.cc
@@ -253,6 +253,8 @@
 
 void InputType::ReadingChecked() const {}
 
+void InputType::WillUpdateCheckedness(bool) {}
+
 bool InputType::SupportsValidation() const {
   return true;
 }
diff --git a/third_party/blink/renderer/core/html/forms/input_type.h b/third_party/blink/renderer/core/html/forms/input_type.h
index cd90252..f4286d60 100644
--- a/third_party/blink/renderer/core/html/forms/input_type.h
+++ b/third_party/blink/renderer/core/html/forms/input_type.h
@@ -104,7 +104,12 @@
   virtual void SetValueAsDecimal(const Decimal&,
                                  TextFieldEventBehavior,
                                  ExceptionState&) const;
+
+  // Functions related to 'checked'
+
   virtual void ReadingChecked() const;
+  // The function is called just before updating checkedness.
+  virtual void WillUpdateCheckedness(bool new_checked);
 
   // Validation functions
 
diff --git a/third_party/blink/renderer/core/html/forms/radio_input_type.cc b/third_party/blink/renderer/core/html/forms/radio_input_type.cc
index de9ca99b3..56395db 100644
--- a/third_party/blink/renderer/core/html/forms/radio_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/radio_input_type.cc
@@ -59,9 +59,30 @@
   HTMLInputElement& input = GetElement();
   if (auto* scope = input.GetRadioButtonGroupScope())
     return scope->IsInRequiredGroup(&input) && !CheckedRadioButtonForGroup();
-  // TODO(crbug.com/883723): This function should work even if this radio
-  // button doesn't belong to any RadioButtonGroupScope.
-  return false;
+
+  // This element is not managed by a RadioButtonGroupScope. We need to traverse
+  // the tree from TreeRoot.
+  DCHECK(!input.isConnected());
+  DCHECK(!input.formOwner());
+  const AtomicString& name = input.GetName();
+  if (name.IsEmpty())
+    return false;
+  bool is_required = false;
+  bool is_checked = false;
+  Node& root = input.TreeRoot();
+  for (auto* another = Traversal<HTMLInputElement>::InclusiveFirstWithin(root);
+       another; another = Traversal<HTMLInputElement>::Next(*another, &root)) {
+    if (another->type() != input_type_names::kRadio ||
+        another->GetName() != name || another->formOwner())
+      continue;
+    if (another->checked())
+      is_checked = true;
+    if (another->FastHasAttribute(html_names::kRequiredAttr))
+      is_required = true;
+    if (is_checked && is_required)
+      return false;
+  }
+  return is_required && !is_checked;
 }
 
 String RadioInputType::ValueMissingText() const {
@@ -257,7 +278,36 @@
     return &input;
   if (auto* scope = input.GetRadioButtonGroupScope())
     return scope->CheckedButtonForGroup(input.GetName());
+
+  // This element is not managed by a RadioButtonGroupScope. We need to traverse
+  // the tree from TreeRoot.
+  DCHECK(!input.isConnected());
+  DCHECK(!input.formOwner());
+  const AtomicString& name = input.GetName();
+  if (name.IsEmpty())
+    return nullptr;
+  Node& root = input.TreeRoot();
+  for (auto* another = Traversal<HTMLInputElement>::InclusiveFirstWithin(root);
+       another; another = Traversal<HTMLInputElement>::Next(*another, &root)) {
+    if (another->type() != input_type_names::kRadio ||
+        another->GetName() != name || another->formOwner())
+      continue;
+    if (another->checked())
+      return another;
+  }
   return nullptr;
 }
 
+void RadioInputType::WillUpdateCheckedness(bool new_checked) {
+  if (!new_checked)
+    return;
+  if (GetElement().GetRadioButtonGroupScope()) {
+    // Buttons in RadioButtonGroupScope are handled in
+    // HTMLInputElement::setChecked().
+    return;
+  }
+  if (auto* input = CheckedRadioButtonForGroup())
+    input->setChecked(false);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/radio_input_type.h b/third_party/blink/renderer/core/html/forms/radio_input_type.h
index 89cfdbf..f305055 100644
--- a/third_party/blink/renderer/core/html/forms/radio_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/radio_input_type.h
@@ -46,6 +46,7 @@
  private:
   void CountUsage() override;
   const AtomicString& FormControlType() const override;
+  void WillUpdateCheckedness(bool new_checked) override;
   bool ValueMissing(const String&) const override;
   String ValueMissingText() const override;
   void HandleClickEvent(MouseEvent&) override;
diff --git a/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc b/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc
index ca06e24b..17d1747c 100644
--- a/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc
@@ -72,22 +72,25 @@
 
 }  // namespace
 
-FlexItem::FlexItem(LayoutBox* box,
+FlexItem::FlexItem(const FlexLayoutAlgorithm* algorithm,
+                   LayoutBox* box,
+                   const ComputedStyle& style,
                    LayoutUnit flex_base_content_size,
                    MinMaxSize min_max_sizes,
                    base::Optional<MinMaxSize> min_max_cross_axis_sizes,
                    LayoutUnit main_axis_border_padding,
-                   LayoutUnit main_axis_margin)
-    : algorithm(nullptr),
+                   NGPhysicalBoxStrut physical_margins)
+    : algorithm(algorithm),
       line_number(0),
       box(box),
+      style(style),
       flex_base_content_size(flex_base_content_size),
       min_max_sizes(min_max_sizes),
       min_max_cross_sizes(min_max_cross_axis_sizes),
       hypothetical_main_content_size(
           min_max_sizes.ClampSizeToMinAndMax(flex_base_content_size)),
       main_axis_border_padding(main_axis_border_padding),
-      main_axis_margin(main_axis_margin),
+      physical_margins(physical_margins),
       frozen(false),
       needs_relayout_for_stretch(false),
       ng_input_node(/* LayoutBox* */ nullptr) {
@@ -97,45 +100,50 @@
 }
 
 bool FlexItem::MainAxisIsInlineAxis() const {
-  return algorithm->IsHorizontalFlow() == box->IsHorizontalWritingMode();
+  return algorithm->IsHorizontalFlow() == style.IsHorizontalWritingMode();
 }
 
 LayoutUnit FlexItem::FlowAwareMarginStart() const {
   if (algorithm->IsHorizontalFlow()) {
-    return algorithm->IsLeftToRightFlow() ? box->MarginLeft()
-                                          : box->MarginRight();
+    return algorithm->IsLeftToRightFlow() ? physical_margins.left
+                                          : physical_margins.right;
   }
-  return algorithm->IsLeftToRightFlow() ? box->MarginTop()
-                                        : box->MarginBottom();
+  return algorithm->IsLeftToRightFlow() ? physical_margins.top
+                                        : physical_margins.bottom;
 }
 
 LayoutUnit FlexItem::FlowAwareMarginEnd() const {
   if (algorithm->IsHorizontalFlow()) {
-    return algorithm->IsLeftToRightFlow() ? box->MarginRight()
-                                          : box->MarginLeft();
+    return algorithm->IsLeftToRightFlow() ? physical_margins.right
+                                          : physical_margins.left;
   }
-  return algorithm->IsLeftToRightFlow() ? box->MarginBottom()
-                                        : box->MarginTop();
+  return algorithm->IsLeftToRightFlow() ? physical_margins.bottom
+                                        : physical_margins.top;
 }
 
 LayoutUnit FlexItem::FlowAwareMarginBefore() const {
   switch (algorithm->GetTransformedWritingMode()) {
     case TransformedWritingMode::kTopToBottomWritingMode:
-      return box->MarginTop();
+      return physical_margins.top;
     case TransformedWritingMode::kBottomToTopWritingMode:
-      return box->MarginBottom();
+      return physical_margins.bottom;
     case TransformedWritingMode::kLeftToRightWritingMode:
-      return box->MarginLeft();
+      return physical_margins.left;
     case TransformedWritingMode::kRightToLeftWritingMode:
-      return box->MarginRight();
+      return physical_margins.right;
   }
   NOTREACHED();
-  return box->MarginTop();
+  return LayoutUnit();
+}
+
+LayoutUnit FlexItem::MainAxisMarginExtent() const {
+  return algorithm->IsHorizontalFlow() ? physical_margins.HorizontalSum()
+                                       : physical_margins.VerticalSum();
 }
 
 LayoutUnit FlexItem::CrossAxisMarginExtent() const {
-  return algorithm->IsHorizontalFlow() ? box->MarginHeight()
-                                       : box->MarginWidth();
+  return algorithm->IsHorizontalFlow() ? physical_margins.VerticalSum()
+                                       : physical_margins.HorizontalSum();
 }
 
 LayoutUnit FlexItem::MarginBoxAscent() const {
@@ -152,31 +160,28 @@
 
 bool FlexItem::HasAutoMarginsInCrossAxis() const {
   if (algorithm->IsHorizontalFlow()) {
-    return box->StyleRef().MarginTop().IsAuto() ||
-           box->StyleRef().MarginBottom().IsAuto();
+    return style.MarginTop().IsAuto() || style.MarginBottom().IsAuto();
   }
-  return box->StyleRef().MarginLeft().IsAuto() ||
-         box->StyleRef().MarginRight().IsAuto();
+  return style.MarginLeft().IsAuto() || style.MarginRight().IsAuto();
 }
 
 ItemPosition FlexItem::Alignment() const {
-  return FlexLayoutAlgorithm::AlignmentForChild(*algorithm->Style(),
-                                                box->StyleRef());
+  return FlexLayoutAlgorithm::AlignmentForChild(*algorithm->Style(), style);
 }
 
 void FlexItem::UpdateAutoMarginsInMainAxis(LayoutUnit auto_margin_offset) {
   DCHECK_GE(auto_margin_offset, LayoutUnit());
 
   if (algorithm->IsHorizontalFlow()) {
-    if (box->StyleRef().MarginLeft().IsAuto())
-      box->SetMarginLeft(auto_margin_offset);
-    if (box->StyleRef().MarginRight().IsAuto())
-      box->SetMarginRight(auto_margin_offset);
+    if (style.MarginLeft().IsAuto())
+      physical_margins.left = auto_margin_offset;
+    if (style.MarginRight().IsAuto())
+      physical_margins.right = auto_margin_offset;
   } else {
-    if (box->StyleRef().MarginTop().IsAuto())
-      box->SetMarginTop(auto_margin_offset);
-    if (box->StyleRef().MarginBottom().IsAuto())
-      box->SetMarginBottom(auto_margin_offset);
+    if (style.MarginTop().IsAuto())
+      physical_margins.top = auto_margin_offset;
+    if (style.MarginBottom().IsAuto())
+      physical_margins.bottom = auto_margin_offset;
   }
 }
 
@@ -186,30 +191,29 @@
   DCHECK_GE(available_alignment_space, LayoutUnit());
 
   bool is_horizontal = algorithm->IsHorizontalFlow();
-  const Length& top_or_left = is_horizontal ? box->StyleRef().MarginTop()
-                                            : box->StyleRef().MarginLeft();
-  const Length& bottom_or_right = is_horizontal ? box->StyleRef().MarginBottom()
-                                                : box->StyleRef().MarginRight();
+  const Length& top_or_left =
+      is_horizontal ? style.MarginTop() : style.MarginLeft();
+  const Length& bottom_or_right =
+      is_horizontal ? style.MarginBottom() : style.MarginRight();
   if (top_or_left.IsAuto() && bottom_or_right.IsAuto()) {
     desired_location.Move(LayoutUnit(), available_alignment_space / 2);
     if (is_horizontal) {
-      box->SetMarginTop(available_alignment_space / 2);
-      box->SetMarginBottom(available_alignment_space / 2);
+      physical_margins.top = available_alignment_space / 2;
+      physical_margins.bottom = available_alignment_space / 2;
     } else {
-      box->SetMarginLeft(available_alignment_space / 2);
-      box->SetMarginRight(available_alignment_space / 2);
+      physical_margins.left = available_alignment_space / 2;
+      physical_margins.right = available_alignment_space / 2;
     }
     return true;
   }
   bool should_adjust_top_or_left = true;
-  if (algorithm->IsColumnFlow() && !box->StyleRef().IsLeftToRightDirection()) {
+  if (algorithm->IsColumnFlow() && !style.IsLeftToRightDirection()) {
     // For column flows, only make this adjustment if topOrLeft corresponds to
     // the "before" margin, so that flipForRightToLeftColumn will do the right
     // thing.
     should_adjust_top_or_left = false;
   }
-  if (!algorithm->IsColumnFlow() &&
-      box->StyleRef().IsFlippedBlocksWritingMode()) {
+  if (!algorithm->IsColumnFlow() && style.IsFlippedBlocksWritingMode()) {
     // If we are a flipped writing mode, we need to adjust the opposite side.
     // This is only needed for row flows because this only affects the
     // block-direction axis.
@@ -221,9 +225,9 @@
       desired_location.Move(LayoutUnit(), available_alignment_space);
 
     if (is_horizontal)
-      box->SetMarginTop(available_alignment_space);
+      physical_margins.top = available_alignment_space;
     else
-      box->SetMarginLeft(available_alignment_space);
+      physical_margins.left = available_alignment_space;
     return true;
   }
   if (bottom_or_right.IsAuto()) {
@@ -231,9 +235,9 @@
       desired_location.Move(LayoutUnit(), available_alignment_space);
 
     if (is_horizontal)
-      box->SetMarginBottom(available_alignment_space);
+      physical_margins.bottom = available_alignment_space;
     else
-      box->SetMarginRight(available_alignment_space);
+      physical_margins.right = available_alignment_space;
     return true;
   }
   return false;
@@ -241,14 +245,13 @@
 
 void FlexItem::ComputeStretchedSize() {
   DCHECK_EQ(Alignment(), ItemPosition::kStretch);
-  if (MainAxisIsInlineAxis() && box->StyleRef().LogicalHeight().IsAuto()) {
+  if (MainAxisIsInlineAxis() && style.LogicalHeight().IsAuto()) {
     LayoutUnit stretched_logical_height =
         std::max(box->BorderAndPaddingLogicalHeight(),
                  Line()->cross_axis_extent - CrossAxisMarginExtent());
     cross_axis_size = box->ConstrainLogicalHeightByMinMax(
         stretched_logical_height, box->IntrinsicContentLogicalHeight());
-  } else if (!MainAxisIsInlineAxis() &&
-             box->StyleRef().LogicalWidth().IsAuto()) {
+  } else if (!MainAxisIsInlineAxis() && style.LogicalWidth().IsAuto()) {
     LayoutUnit child_width =
         (Line()->cross_axis_extent - CrossAxisMarginExtent())
             .ClampNegativeToZero();
@@ -588,9 +591,8 @@
     }
     line_has_in_flow_item = true;
     sum_flex_base_size += flex_item.FlexBaseMarginBoxSize();
-    total_flex_grow += flex_item.box->StyleRef().ResolvedFlexGrow(StyleRef());
-    const float flex_shrink =
-        flex_item.box->StyleRef().ResolvedFlexShrink(StyleRef());
+    total_flex_grow += flex_item.style.ResolvedFlexGrow(StyleRef());
+    const float flex_shrink = flex_item.style.ResolvedFlexShrink(StyleRef());
     total_flex_shrink += flex_shrink;
     total_weighted_flex_shrink +=
         flex_shrink * flex_item.flex_base_content_size;
@@ -967,14 +969,17 @@
          child_number < line_context.line_items.size(); ++child_number) {
       FlexItem& flex_item = line_context.line_items[child_number];
       LayoutUnit item_main_size = flex_item.FlexedBorderBoxSize();
+
+      NGBoxStrut margins = flex_item.physical_margins.ConvertToLogical(
+          Style()->GetWritingMode(), Style()->Direction());
+
       // We passed 0 as the initial main_axis offset to ComputeLineItemsPosition
       // for ColumnReverse containers so here we have to add the
       // border_scrollbar_padding of the container.
       flex_item.desired_location.SetX(
           main_axis_content_size + border_scrollbar_padding_before -
-          flex_item.desired_location.X() - item_main_size -
-          flex_item.box->MarginAfter(Style()) +
-          flex_item.box->MarginBefore(Style()));
+          flex_item.desired_location.X() - item_main_size - margins.block_end +
+          margins.block_start);
     }
   }
 }
diff --git a/third_party/blink/renderer/core/layout/flexible_box_algorithm.h b/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
index b833870..d26e1367 100644
--- a/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
+++ b/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
@@ -116,21 +116,24 @@
   // - |min_max_sizes| is the resolved min and max size properties in the
   //   main axis direction (not intrinsic widths). It does not include
   //   border/scrollbar/padding.
-  FlexItem(LayoutBox*,
+  FlexItem(const FlexLayoutAlgorithm*,
+           LayoutBox*,
+           const ComputedStyle& style,
            LayoutUnit flex_base_content_size,
            MinMaxSize min_max_main_axis_sizes,
            // Ignored for legacy, required for NG:
            base::Optional<MinMaxSize> min_max_cross_axis_sizes,
            LayoutUnit main_axis_border_padding,
-           LayoutUnit main_axis_margin);
+           NGPhysicalBoxStrut physical_margins);
 
   LayoutUnit HypotheticalMainAxisMarginBoxSize() const {
     return hypothetical_main_content_size + main_axis_border_padding +
-           main_axis_margin;
+           MainAxisMarginExtent();
   }
 
   LayoutUnit FlexBaseMarginBoxSize() const {
-    return flex_base_content_size + main_axis_border_padding + main_axis_margin;
+    return flex_base_content_size + main_axis_border_padding +
+           MainAxisMarginExtent();
   }
 
   LayoutUnit FlexedBorderBoxSize() const {
@@ -138,7 +141,8 @@
   }
 
   LayoutUnit FlexedMarginBoxSize() const {
-    return flexed_content_size + main_axis_border_padding + main_axis_margin;
+    return flexed_content_size + main_axis_border_padding +
+           MainAxisMarginExtent();
   }
 
   LayoutUnit ClampSizeToMinAndMax(LayoutUnit size) const {
@@ -152,6 +156,8 @@
   LayoutUnit FlowAwareMarginStart() const;
   LayoutUnit FlowAwareMarginEnd() const;
   LayoutUnit FlowAwareMarginBefore() const;
+
+  LayoutUnit MainAxisMarginExtent() const;
   LayoutUnit CrossAxisMarginExtent() const;
 
   LayoutUnit MarginBoxAscent() const;
@@ -178,15 +184,17 @@
                                     bool is_wrap_reverse,
                                     bool is_deprecated_webkit_box);
 
-  FlexLayoutAlgorithm* algorithm;
+  const FlexLayoutAlgorithm* algorithm;
   wtf_size_t line_number;
   LayoutBox* box;
+  const ComputedStyle& style;
   const LayoutUnit flex_base_content_size;
   const MinMaxSize min_max_sizes;
   const base::Optional<MinMaxSize> min_max_cross_sizes;
   const LayoutUnit hypothetical_main_content_size;
   const LayoutUnit main_axis_border_padding;
-  const LayoutUnit main_axis_margin;
+  NGPhysicalBoxStrut physical_margins;
+
   LayoutUnit flexed_content_size;
 
   // When set by the caller, this should be the size pre-stretching.
@@ -352,14 +360,13 @@
 
   template <typename... Args>
   FlexItem& emplace_back(Args&&... args) {
-    FlexItem& item = all_items_.emplace_back(std::forward<Args>(args)...);
-    item.algorithm = this;
-    return item;
+    return all_items_.emplace_back(this, std::forward<Args>(args)...);
   }
 
   const ComputedStyle* Style() const { return style_; }
   const ComputedStyle& StyleRef() const { return *style_; }
 
+  const Vector<FlexLine>& FlexLines() const { return flex_lines_; }
   Vector<FlexLine>& FlexLines() { return flex_lines_; }
 
   // Computes the next flex line, stores it in FlexLines(), and returns a
diff --git a/third_party/blink/renderer/core/layout/layout_flexible_box.cc b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
index 4403c772..25476355 100644
--- a/third_party/blink/renderer/core/layout/layout_flexible_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
@@ -1018,19 +1018,11 @@
       continue;
 
     // Before running the flex algorithm, 'auto' has a margin of 0.
-    // Also, if we're not auto sizing, we don't do a layout that computes the
-    // start/end margins.
-    if (IsHorizontalFlow()) {
-      child->SetMarginLeft(
-          ComputeChildMarginValue(child->StyleRef().MarginLeft()));
-      child->SetMarginRight(
-          ComputeChildMarginValue(child->StyleRef().MarginRight()));
-    } else {
-      child->SetMarginTop(
-          ComputeChildMarginValue(child->StyleRef().MarginTop()));
-      child->SetMarginBottom(
-          ComputeChildMarginValue(child->StyleRef().MarginBottom()));
-    }
+    const ComputedStyle& style = child->StyleRef();
+    child->SetMarginTop(ComputeChildMarginValue(style.MarginTop()));
+    child->SetMarginRight(ComputeChildMarginValue(style.MarginRight()));
+    child->SetMarginBottom(ComputeChildMarginValue(style.MarginBottom()));
+    child->SetMarginLeft(ComputeChildMarginValue(style.MarginLeft()));
   }
 }
 
@@ -1213,11 +1205,12 @@
   MinMaxSize sizes =
       ComputeMinAndMaxSizesForChild(*algorithm, child, border_and_padding);
 
-  LayoutUnit margin =
-      IsHorizontalFlow() ? child.MarginWidth() : child.MarginHeight();
-  algorithm->emplace_back(&child, child_inner_flex_base_size, sizes,
+  NGPhysicalBoxStrut physical_margins(child.MarginTop(), child.MarginRight(),
+                                      child.MarginBottom(), child.MarginLeft());
+  algorithm->emplace_back(&child, child.StyleRef(), child_inner_flex_base_size,
+                          sizes,
                           /* cross axis min max sizes */ base::nullopt,
-                          border_and_padding, margin);
+                          border_and_padding, physical_margins);
 }
 
 void LayoutFlexibleBox::SetOverrideMainAxisContentSizeForChild(FlexItem& item) {
@@ -1454,6 +1447,7 @@
     const FlexItem& flex_item = current_line->line_items[i];
     LayoutBox* child = flex_item.box;
     SetFlowAwareLocationForChild(*child, flex_item.desired_location);
+    child->SetMargin(flex_item.physical_margins);
 
     if (is_paginated)
       UpdateFragmentationInfoForChild(*child);
@@ -1557,6 +1551,7 @@
         flex_item.needs_relayout_for_stretch = false;
       }
       ResetAlignmentForChild(*flex_item.box, flex_item.desired_location.Y());
+      flex_item.box->SetMargin(flex_item.physical_margins);
     }
   }
 }
diff --git a/third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h b/third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h
index f5c78a92..3c01e9f 100644
--- a/third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h
+++ b/third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h
@@ -118,6 +118,10 @@
   LayoutUnit InlineSum() const { return inline_start + inline_end; }
   LayoutUnit BlockSum() const { return line_over + line_under; }
 
+  bool IsEmpty() const {
+    return !inline_start && !inline_end && !line_over && !line_under;
+  }
+
   bool operator==(const NGLineBoxStrut& other) const {
     return inline_start == other.inline_start &&
            inline_end == other.inline_end && line_over == other.line_over &&
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
index c184209..37edfc10 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_caret_position.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h"
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
 
 namespace blink {
@@ -52,10 +53,9 @@
       ink_overflow_computed_(false) {}
 
 NGFragmentItem::NGFragmentItem(const NGPhysicalBoxFragment& box,
-                               wtf_size_t item_count,
                                TextDirection resolved_direction)
     : layout_object_(box.GetLayoutObject()),
-      box_({&box, item_count}),
+      box_({&box, 1}),
       rect_({PhysicalOffset(), box.Size()}),
       type_(kBox),
       style_variant_(static_cast<unsigned>(box.StyleVariant())),
@@ -63,6 +63,21 @@
       text_direction_(static_cast<unsigned>(resolved_direction)),
       ink_overflow_computed_(false) {}
 
+NGFragmentItem::NGFragmentItem(const NGInlineItem& inline_item,
+                               const PhysicalSize& size)
+    : layout_object_(inline_item.GetLayoutObject()),
+      box_({nullptr, 1}),
+      rect_({PhysicalOffset(), size}),
+      type_(kBox),
+      style_variant_(static_cast<unsigned>(inline_item.StyleVariant())),
+      is_hidden_for_paint_(false),
+      text_direction_(static_cast<unsigned>(TextDirection::kLtr)),
+      ink_overflow_computed_(false) {
+  DCHECK_EQ(inline_item.Type(), NGInlineItem::kOpenTag);
+  DCHECK(layout_object_);
+  DCHECK(layout_object_->IsLayoutInline());
+}
+
 NGFragmentItem::~NGFragmentItem() {
   switch (Type()) {
     case kText:
@@ -88,6 +103,16 @@
   return GetLayoutObject()->Parent() == other.GetLayoutObject()->Parent();
 }
 
+bool NGFragmentItem::IsInlineBox() const {
+  if (Type() == kBox) {
+    if (const NGPhysicalBoxFragment* box = BoxFragment())
+      return box->IsInlineBox();
+    DCHECK(GetLayoutObject()->IsLayoutInline());
+    return true;
+  }
+  return false;
+}
+
 bool NGFragmentItem::IsAtomicInline() const {
   if (Type() != kBox)
     return false;
@@ -327,9 +352,13 @@
   if (Type() == kLine) {
     // Line boxes don't have self overflow. Compute content overflow only.
     *self_and_contents_rect_out = contents_rect;
-  } else if (const NGPhysicalBoxFragment* box_fragment = BoxFragment()) {
-    DCHECK(box_fragment->IsInlineBox());
-    self_rect = box_fragment->ComputeSelfInkOverflow();
+  } else if (Type() == kBox) {
+    if (const NGPhysicalBoxFragment* box_fragment = BoxFragment()) {
+      DCHECK(box_fragment->IsInlineBox());
+      self_rect = box_fragment->ComputeSelfInkOverflow();
+    } else {
+      self_rect = LocalRect();
+    }
     *self_and_contents_rect_out = UnionRect(self_rect, contents_rect);
   } else {
     NOTREACHED();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
index 112464b..7cee04b 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
@@ -18,6 +18,7 @@
 
 class NGFragmentItems;
 class NGInlineBreakToken;
+class NGInlineItem;
 struct NGTextFragmentPaintInfo;
 
 // This class represents a text run or a box in an inline formatting context.
@@ -64,8 +65,8 @@
   // TODO(kojii): Should be able to create without once creating fragments.
   NGFragmentItem(const NGPhysicalTextFragment& text);
   NGFragmentItem(const NGPhysicalBoxFragment& box,
-                 wtf_size_t item_count,
                  TextDirection resolved_direction);
+  NGFragmentItem(const NGInlineItem& inline_item, const PhysicalSize& size);
   NGFragmentItem(const NGPhysicalLineBoxFragment& line, wtf_size_t item_count);
 
   ~NGFragmentItem() final;
@@ -74,6 +75,7 @@
 
   bool IsText() const { return Type() == kText || Type() == kGeneratedText; }
   bool IsContainer() const { return Type() == kBox || Type() == kLine; }
+  bool IsInlineBox() const;
   bool IsAtomicInline() const;
   bool IsEmptyLineBox() const;
   bool IsHiddenForPaint() const { return is_hidden_for_paint_; }
@@ -128,6 +130,10 @@
     return 0;
   }
   bool HasChildren() const { return DescendantsCount() > 1; }
+  void SetDescendantsCount(wtf_size_t count) {
+    CHECK_EQ(Type(), kBox);
+    box_.descendants_count = count;
+  }
 
   // Returns |NGPhysicalBoxFragment| if one is associated with this item.
   const NGPhysicalBoxFragment* BoxFragment() const {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
index bc573b0..388b408f 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
@@ -108,7 +108,6 @@
   ASSERT_NE(span1, nullptr);
   Vector<const NGFragmentItem*> items_for_span1 = ItemsForAsVector(*span1);
   EXPECT_EQ(items_for_span1.size(), 2u);
-
   EXPECT_EQ(IntRect(0, 0, 80, 20), span1->FragmentsVisualRectBoundingBox());
 
   // "span2" doesn't wrap, produces only one fragment.
@@ -116,8 +115,52 @@
   ASSERT_NE(span2, nullptr);
   Vector<const NGFragmentItem*> items_for_span2 = ItemsForAsVector(*span2);
   EXPECT_EQ(items_for_span2.size(), 1u);
-
   EXPECT_EQ(IntRect(0, 20, 80, 10), span2->FragmentsVisualRectBoundingBox());
 }
 
+// Same as |BasicInlineBox| but `<span>`s do not have background.
+// They will not need box fragments, but all operations should work the same.
+TEST_F(NGFragmentItemTest, CulledInlineBox) {
+  LoadAhem();
+  SetBodyInnerHTML(R"HTML(
+    <style>
+    html, body {
+      margin: 0;
+      font-family: Ahem;
+      font-size: 10px;
+      line-height: 1;
+    }
+    #container {
+      width: 10ch;
+    }
+    </style>
+    <div id="container">
+      000
+      <span id="span1">1234 5678</span>
+      999
+      <span id="span2">12345678</span>
+    </div>
+  )HTML");
+
+  // "span1" wraps, produces two fragments.
+  const LayoutObject* span1 = GetLayoutObjectByElementId("span1");
+  ASSERT_NE(span1, nullptr);
+  Vector<const NGFragmentItem*> items_for_span1 = ItemsForAsVector(*span1);
+  EXPECT_EQ(items_for_span1.size(), 2u);
+  EXPECT_EQ(IntRect(0, 0, 80, 20), span1->FragmentsVisualRectBoundingBox());
+
+  // "span2" doesn't wrap, produces only one fragment.
+  const LayoutObject* span2 = GetLayoutObjectByElementId("span2");
+  ASSERT_NE(span2, nullptr);
+  Vector<const NGFragmentItem*> items_for_span2 = ItemsForAsVector(*span2);
+  EXPECT_EQ(items_for_span2.size(), 1u);
+  EXPECT_EQ(IntRect(0, 20, 80, 10), span2->FragmentsVisualRectBoundingBox());
+
+  // Except that they do not produce box fragments.
+  for (const NGFragmentItem* item : items_for_span1)
+    EXPECT_EQ(item->BoxFragment(), nullptr);
+  for (const NGFragmentItem* item : items_for_span2)
+    EXPECT_EQ(item->BoxFragment(), nullptr);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
index 637d2faa4..fa1d73a 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
@@ -70,28 +70,32 @@
     Child& child = *child_iter;
     if (const NGPhysicalTextFragment* text = child.fragment.get()) {
       items_.push_back(std::make_unique<NGFragmentItem>(*text));
-      offsets_.push_back(child.offset);
+      offsets_.push_back(child.rect.offset);
       ++child_iter;
       continue;
     }
 
-    if (child.layout_result) {
+    if (child.layout_result || child.inline_item) {
       // Create an item if this box has no inline children.
-      const NGPhysicalBoxFragment& box =
-          To<NGPhysicalBoxFragment>(child.layout_result->PhysicalFragment());
-      // Floats are in the fragment tree, not in the fragment item list.
-      DCHECK(!box.IsFloating());
+      std::unique_ptr<NGFragmentItem> item;
+      if (child.layout_result) {
+        const NGPhysicalBoxFragment& box =
+            To<NGPhysicalBoxFragment>(child.layout_result->PhysicalFragment());
+        // Floats are in the fragment tree, not in the fragment item list.
+        DCHECK(!box.IsFloating());
+        item = std::make_unique<NGFragmentItem>(box, child.ResolvedDirection());
+      } else {
+        DCHECK(child.inline_item);
+        item = std::make_unique<NGFragmentItem>(
+            *child.inline_item,
+            ToPhysicalSize(child.rect.size,
+                           child.inline_item->Style()->GetWritingMode()));
+      }
 
       // Take the fast path when we know |child| does not have child items.
       if (child.children_count <= 1) {
-        // Compute |has_floating_descendants_for_paint_| to optimize tree
-        // traversal in paint.
-        if (!has_floating_descendants_for_paint_ && box.IsFloating())
-          has_floating_descendants_for_paint_ = true;
-
-        items_.push_back(std::make_unique<NGFragmentItem>(
-            box, 1, child.ResolvedDirection()));
-        offsets_.push_back(child.offset);
+        items_.push_back(std::move(item));
+        offsets_.push_back(child.rect.offset);
         ++child_iter;
         continue;
       }
@@ -102,7 +106,7 @@
       // Add an empty item so that the start of the box can be set later.
       wtf_size_t box_start_index = items_.size();
       items_.Grow(box_start_index + 1);
-      offsets_.push_back(child.offset);
+      offsets_.push_back(child.rect.offset);
 
       // Add all children, including their desendants, skipping this item.
       CHECK_GE(child.children_count, 1u);  // 0 will loop infinitely.
@@ -116,8 +120,8 @@
       wtf_size_t item_count = items_.size() - box_start_index;
 
       // Create an item for the start of the box.
-      items_[box_start_index] = std::make_unique<NGFragmentItem>(
-          box, item_count, child.ResolvedDirection());
+      item->SetDescendantsCount(item_count);
+      items_[box_start_index] = std::move(item);
       continue;
     }
 
@@ -135,7 +139,7 @@
   // are not inline.
   const TextDirection resolved_direction = TextDirection::kLtr;
   items_.push_back(
-      std::make_unique<NGFragmentItem>(marker_fragment, 1, resolved_direction));
+      std::make_unique<NGFragmentItem>(marker_fragment, resolved_direction));
   offsets_.push_back(offset);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
index 5827d57c..bf86ca8 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
@@ -157,6 +157,7 @@
     NGLineBoxFragmentBuilder::ChildList* line_box) {
   NGInlineBoxState* box =
       OnOpenTag(item, item_result, baseline_type, *line_box);
+  box->needs_box_fragment = item.ShouldCreateBoxFragment();
   AddBoxFragmentPlaceholder(box, line_box, baseline_type);
   return box;
 }
@@ -173,7 +174,6 @@
   box->fragment_start = line_box.size();
   box->style = &style;
   box->item = &item;
-  box->needs_box_fragment = item.ShouldCreateBoxFragment();
   box->has_start_edge = item_result.has_edge;
   box->margin_inline_start = item_result.margins.inline_start;
   box->margin_inline_end = item_result.margins.inline_end;
@@ -215,7 +215,7 @@
     const NGLineBoxFragmentBuilder::Child& placeholder =
         (*line_box)[box_data.fragment_start];
     DCHECK(placeholder.IsPlaceholder());
-    box_data.offset = placeholder.offset;
+    box_data.rect.offset = placeholder.rect.offset;
   }
 }
 
@@ -223,8 +223,13 @@
     NGInlineBoxState* box,
     NGLineBoxFragmentBuilder::ChildList* line_box,
     FontBaseline baseline_type) {
-  if (box->needs_box_fragment)
-    AddBoxData(box, line_box);
+  if (!RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
+    if (box->needs_box_fragment)
+      AddBoxData(box, line_box);
+  } else {
+    if (box->has_box_placeholder)
+      AddBoxData(box, line_box);
+  }
 
   PositionPending position_pending =
       ApplyBaselineShift(box, line_box, baseline_type);
@@ -241,12 +246,6 @@
     parent_box.metrics.Unite(box->metrics);
 }
 
-void NGInlineBoxState::SetNeedsBoxFragment() {
-  DCHECK(item);
-  DCHECK(!needs_box_fragment);
-  needs_box_fragment = true;
-}
-
 // Crete a placeholder for a box fragment.
 // We keep a flat list of fragments because it is more suitable for operations
 // such as ApplyBaselineShift. Later, CreateBoxFragments() creates box fragments
@@ -255,6 +254,9 @@
     NGInlineBoxState* box,
     NGLineBoxFragmentBuilder::ChildList* line_box,
     FontBaseline baseline_type) {
+  DCHECK(box != stack_.begin() &&
+         box->item->Type() != NGInlineItem::kAtomicInline);
+  box->has_box_placeholder = true;
   DCHECK(box->style);
   const ComputedStyle& style = *box->style;
 
@@ -281,7 +283,10 @@
 void NGInlineLayoutStateStack::AddBoxData(
     NGInlineBoxState* box,
     NGLineBoxFragmentBuilder::ChildList* line_box) {
-  DCHECK(box->needs_box_fragment);
+  DCHECK(box->needs_box_fragment ||
+         (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled() &&
+          box->has_box_placeholder && box != stack_.begin() &&
+          box->item->Type() != NGInlineItem::kAtomicInline));
   DCHECK(box->style);
   const ComputedStyle& style = *box->style;
   NGLineBoxFragmentBuilder::Child& placeholder =
@@ -290,27 +295,34 @@
   const unsigned fragment_end = line_box->size();
   DCHECK(box->item);
   BoxData& box_data = box_data_list_.emplace_back(
-      box->fragment_start, fragment_end, box->item, placeholder.size);
-  box_data.padding = box->padding;
-  if (box->has_start_edge) {
-    box_data.has_line_left_edge = true;
-    box_data.margin_line_left = box->margin_inline_start;
-    box_data.margin_border_padding_line_left = box->margin_inline_start +
-                                               box->borders.inline_start +
-                                               box->padding.inline_start;
-  }
-  if (box->has_end_edge) {
-    box_data.has_line_right_edge = true;
-    box_data.margin_line_right = box->margin_inline_end;
-    box_data.margin_border_padding_line_right = box->margin_inline_end +
-                                                box->borders.inline_end +
-                                                box->padding.inline_end;
-  }
-  if (IsRtl(style.Direction())) {
-    std::swap(box_data.has_line_left_edge, box_data.has_line_right_edge);
-    std::swap(box_data.margin_line_left, box_data.margin_line_right);
-    std::swap(box_data.margin_border_padding_line_left,
-              box_data.margin_border_padding_line_right);
+      box->fragment_start, fragment_end, box->item, placeholder.Size());
+  if (box->needs_box_fragment) {
+    box_data.padding = box->padding;
+    if (box->has_start_edge) {
+      box_data.has_line_left_edge = true;
+      box_data.margin_line_left = box->margin_inline_start;
+      box_data.margin_border_padding_line_left = box->margin_inline_start +
+                                                 box->borders.inline_start +
+                                                 box->padding.inline_start;
+    }
+    if (box->has_end_edge) {
+      box_data.has_line_right_edge = true;
+      box_data.margin_line_right = box->margin_inline_end;
+      box_data.margin_border_padding_line_right = box->margin_inline_end +
+                                                  box->borders.inline_end +
+                                                  box->padding.inline_end;
+    }
+    if (IsRtl(style.Direction())) {
+      std::swap(box_data.has_line_left_edge, box_data.has_line_right_edge);
+      std::swap(box_data.margin_line_left, box_data.margin_line_right);
+      std::swap(box_data.margin_border_padding_line_left,
+                box_data.margin_border_padding_line_right);
+    }
+  } else {
+    DCHECK_EQ(box->margin_inline_start, 0);
+    DCHECK_EQ(box->margin_inline_end, 0);
+    DCHECK(box->padding.IsEmpty());
+    DCHECK(box->borders.IsEmpty());
   }
 
   DCHECK((*line_box)[box->fragment_start].IsPlaceholder());
@@ -321,10 +333,10 @@
   // Do not defer creating a box fragment if this is an empty inline box.
   // An empty box fragment is still flat that we do not have to defer.
   // Also, placeholders cannot be reordred if empty.
-  placeholder.offset.inline_offset += box_data.margin_line_left;
+  placeholder.rect.offset.inline_offset += box_data.margin_line_left;
   LayoutUnit advance = box_data.margin_border_padding_line_left +
                        box_data.margin_border_padding_line_right;
-  box_data.size.inline_size =
+  box_data.rect.size.inline_size =
       advance - box_data.margin_line_left - box_data.margin_line_right;
   placeholder.layout_result = box_data.CreateBoxFragment(line_box);
   placeholder.inline_size = advance;
@@ -501,8 +513,8 @@
   // origins at (0, 0). Accumulate inline offset from left to right.
   LayoutUnit position;
   for (NGLineBoxFragmentBuilder::Child& child : *line_box) {
-    child.margin_line_left = child.offset.inline_offset;
-    child.offset.inline_offset += position;
+    child.margin_line_left = child.rect.offset.inline_offset;
+    child.rect.offset.inline_offset += position;
     // Box margins/boders/paddings will be processed later.
     // TODO(kojii): we could optimize this if the reordering did not occur.
     if (!child.HasFragment())
@@ -548,7 +560,7 @@
     unsigned start = box_data.fragment_start;
     NGLineBoxFragmentBuilder::Child& start_child = (*line_box)[start];
     LayoutUnit line_left_offset =
-        start_child.offset.inline_offset - start_child.margin_line_left;
+        start_child.rect.offset.inline_offset - start_child.margin_line_left;
     LinePadding& start_padding = accumulated_padding[start];
     start_padding.line_left += box_data.margin_border_padding_line_left;
     line_left_offset -= start_padding.line_left - box_data.margin_line_left;
@@ -556,15 +568,15 @@
     DCHECK_GT(box_data.fragment_end, start);
     unsigned last = box_data.fragment_end - 1;
     NGLineBoxFragmentBuilder::Child& last_child = (*line_box)[last];
-    LayoutUnit line_right_offset = last_child.offset.inline_offset -
+    LayoutUnit line_right_offset = last_child.rect.offset.inline_offset -
                                    last_child.margin_line_left +
                                    last_child.inline_size;
     LinePadding& last_padding = accumulated_padding[last];
     last_padding.line_right += box_data.margin_border_padding_line_right;
     line_right_offset += last_padding.line_right - box_data.margin_line_right;
 
-    box_data.offset.inline_offset = line_left_offset;
-    box_data.size.inline_size = line_right_offset - line_left_offset;
+    box_data.rect.offset.inline_offset = line_left_offset;
+    box_data.rect.size.inline_size = line_right_offset - line_left_offset;
   }
 
   return position;
@@ -579,18 +591,36 @@
     unsigned end = box_data.fragment_end;
     DCHECK_GT(end, start);
     NGLineBoxFragmentBuilder::Child* child = &(*line_box)[start];
-    scoped_refptr<const NGLayoutResult> box_fragment =
-        box_data.CreateBoxFragment(line_box);
+    if (box_data.item->ShouldCreateBoxFragment()) {
+      scoped_refptr<const NGLayoutResult> box_fragment =
+          box_data.CreateBoxFragment(line_box);
+      if (child->IsPlaceholder()) {
+        child->layout_result = std::move(box_fragment);
+        child->rect = box_data.rect;
+        child->children_count = end - start;
+        continue;
+      }
+
+      // |AddBoxFragmentPlaceholder| adds a placeholder at |fragment_start|, but
+      // bidi reordering may move it. Insert in such case.
+      line_box->InsertChild(start, std::move(box_fragment),
+                            box_data.rect.offset, end - start + 1);
+      ChildInserted(start + 1);
+      continue;
+    }
+
+    DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
+    DCHECK(box_data.item);
     if (child->IsPlaceholder()) {
-      child->layout_result = std::move(box_fragment);
-      child->offset = box_data.offset;
+      child->inline_item = box_data.item;
+      child->rect = box_data.rect;
       child->children_count = end - start;
       continue;
     }
 
     // |AddBoxFragmentPlaceholder| adds a placeholder at |fragment_start|, but
     // bidi reordering may move it. Insert in such case.
-    line_box->InsertChild(start, std::move(box_fragment), box_data.offset,
+    line_box->InsertChild(start, /*box_fragment*/ nullptr, box_data.rect.offset,
                           end - start + 1);
     ChildInserted(start + 1);
   }
@@ -606,8 +636,8 @@
   const ComputedStyle& style = *item->Style();
 
   NGFragmentGeometry fragment_geometry;
-  fragment_geometry.border_box_size = {size.inline_size.ClampNegativeToZero(),
-                                       size.block_size};
+  fragment_geometry.border_box_size = {
+      rect.size.inline_size.ClampNegativeToZero(), rect.size.block_size};
   fragment_geometry.padding =
       NGBoxStrut(padding, IsFlippedLinesWritingMode(style.GetWritingMode()));
 
@@ -633,7 +663,7 @@
       // child.offset is the static position wrt. the linebox. As we are adding
       // this as a child of an inline level fragment, we adjust the static
       // position to be relative to this fragment.
-      LogicalOffset static_offset = child.offset - offset;
+      LogicalOffset static_offset = child.rect.offset - rect.offset;
 
       box.AddOutOfFlowInlineChildCandidate(oof_box, static_offset,
                                            child.container_direction);
@@ -650,16 +680,18 @@
 
     if (child.layout_result) {
       box.AddChild(child.layout_result->PhysicalFragment(),
-                   child.offset - offset);
+                   child.rect.offset - rect.offset);
       child.layout_result.reset();
     } else if (child.fragment) {
-      box.AddChild(std::move(child.fragment), child.offset - offset);
+      box.AddChild(std::move(child.fragment), child.rect.offset - rect.offset);
     }
   }
 
-  // Inline boxes that produce DisplayItemClient should do full paint
-  // invalidations.
-  item->GetLayoutObject()->SetShouldDoFullPaintInvalidation();
+  if (!RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
+    // Inline boxes that produce DisplayItemClient should do full paint
+    // invalidations.
+    item->GetLayoutObject()->SetShouldDoFullPaintInvalidation();
+  }
 
   box.MoveOutOfFlowDescendantCandidatesToDescendants();
   return box.ToInlineBoxFragment();
@@ -835,9 +867,9 @@
     const NGLineBoxFragmentBuilder::Child& placeholder =
         line_box[box_data.fragment_start];
     DCHECK(placeholder.IsPlaceholder());
-    LayoutUnit box_ascent = -placeholder.offset.block_offset;
+    LayoutUnit box_ascent = -placeholder.rect.offset.block_offset;
     NGLineHeightMetrics box_metrics(box_ascent,
-                                    box_data.size.block_size - box_ascent);
+                                    box_data.rect.size.block_size - box_ascent);
     // The top/bottom of inline boxes should not include their paddings.
     box_metrics.ascent -= box_data.padding.line_over;
     box_metrics.descent -= box_data.padding.line_under;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
index c4521acc..2431f01 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_INLINE_BOX_STATE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_INLINE_BOX_STATE_H_
 
-#include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
+#include "third_party/blink/renderer/core/layout/geometry/logical_rect.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h"
 #include "third_party/blink/renderer/core/style/computed_style_constants.h"
@@ -67,6 +67,7 @@
 
   Vector<NGPendingPositions> pending_descendants;
   bool include_used_fonts = false;
+  bool has_box_placeholder = false;
   bool needs_box_fragment = false;
 
   // True if this box has a metrics, including pending ones. Pending metrics
@@ -88,9 +89,6 @@
   // 'text-top' offset for 'vertical-align'.
   LayoutUnit TextTop(FontBaseline baseline_type) const;
 
-  // Create a box fragment for this box.
-  void SetNeedsBoxFragment();
-
   // Returns if the text style can be added without open-tag.
   // Text with different font or vertical-align needs to be wrapped with an
   // inline box.
@@ -217,14 +215,16 @@
             unsigned end,
             const NGInlineItem* item,
             LogicalSize size)
-        : fragment_start(start), fragment_end(end), item(item), size(size) {}
+        : fragment_start(start),
+          fragment_end(end),
+          item(item),
+          rect(LogicalOffset(), size) {}
 
     BoxData(const BoxData& other, unsigned start, unsigned end)
         : fragment_start(start),
           fragment_end(end),
           item(other.item),
-          size(other.size),
-          offset(other.offset) {}
+          rect(other.rect) {}
 
     void SetFragmentRange(unsigned start_index, unsigned end_index) {
       fragment_start = start_index;
@@ -236,7 +236,7 @@
     unsigned fragment_end;
 
     const NGInlineItem* item;
-    LogicalSize size;
+    LogicalRect rect;
 
     bool has_line_left_edge = false;
     bool has_line_right_edge = false;
@@ -247,7 +247,6 @@
     LayoutUnit margin_border_padding_line_left;
     LayoutUnit margin_border_padding_line_right;
 
-    LogicalOffset offset;
     unsigned parent_box_data_index = 0;
     unsigned fragmented_box_data_index = 0;
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
index df7664e6..0e8ccb3 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -163,6 +163,15 @@
   return !break_token.IsFinished() && !break_token.IsForcedBreak();
 }
 
+bool NGInlineCursor::IsInlineBox() const {
+  if (current_paint_fragment_)
+    return current_paint_fragment_->PhysicalFragment().IsInlineBox();
+  if (current_item_)
+    return current_item_->IsInlineBox();
+  NOTREACHED();
+  return false;
+}
+
 bool NGInlineCursor::IsAtomicInline() const {
   if (current_paint_fragment_)
     return current_paint_fragment_->PhysicalFragment().IsAtomicInline();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
index 9c23ab2..1bb12a8 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
@@ -105,7 +105,10 @@
   // other than line.
   bool HasSoftWrapToNextLine() const;
 
-  // True if the current position is a atomic inline. It is error to call at
+  // True if the current position is an inline box. It is error to call at end.
+  bool IsInlineBox() const;
+
+  // True if the current position is an atomic inline. It is error to call at
   // end.
   bool IsAtomicInline() const;
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc
index 8ded9661..ee04d1c 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc
@@ -100,8 +100,12 @@
 
   Vector<String> ToDebugStringListWithBidiLevel(const NGInlineCursor& start) {
     Vector<String> list;
-    for (NGInlineCursor cursor(start); cursor; cursor.MoveToNext())
+    for (NGInlineCursor cursor(start); cursor; cursor.MoveToNext()) {
+      // Inline boxes do not have bidi level.
+      if (cursor.IsInlineBox())
+        continue;
       list.push_back(ToDebugStringWithBidiLevel(cursor));
+    }
     return list;
   }
 
@@ -126,8 +130,8 @@
       "<div id=root dir=ltr>"
       "abc<b id=def>def</b><bdo dir=rtl><b id=ghi>GHI</b></bdo>jkl</div>");
   Vector<String> list = ToDebugStringListWithBidiLevel(cursor);
-  EXPECT_THAT(list, ElementsAre("#linebox", "abc:0", "#def:0",
-                                "LayoutInline BDO", "#ghi:1", "jkl:0"));
+  EXPECT_THAT(list,
+              ElementsAre("#linebox", "abc:0", "#def:0", "#ghi:1", "jkl:0"));
 }
 
 TEST_P(NGInlineCursorTest, BidiLevelInlineBoxRTL) {
@@ -136,8 +140,8 @@
       "<div id=root dir=rtl>"
       "abc<b id=def>def</b><bdo dir=rtl><b id=ghi>GHI</b></bdo>jkl</div>");
   Vector<String> list = ToDebugStringListWithBidiLevel(cursor);
-  EXPECT_THAT(list, ElementsAre("#linebox", "LayoutInline BDO", "#ghi:3",
-                                "jkl:2", "#def:1", "abc:2"));
+  EXPECT_THAT(list,
+              ElementsAre("#linebox", "#ghi:3", "jkl:2", "#def:1", "abc:2"));
 }
 
 TEST_P(NGInlineCursorTest, BidiLevelSimpleLTR) {
@@ -212,9 +216,14 @@
     list.push_back(ToDebugString(cursor));
     cursor.MoveToNextForSameLayoutObject();
   }
-  EXPECT_THAT(list, ElementsAre("abc", "ABC", "", "XYZ", "xyz"));
+  if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled())
+    EXPECT_THAT(list, ElementsAre("#culled", "#culled"));
+  else
+    EXPECT_THAT(list, ElementsAre("abc", "ABC", "", "XYZ", "xyz"));
 }
 
+// We should not have float:right fragment, because it isn't in-flow in
+// an inline formatting context.
 // For https://crbug.com/1026022
 TEST_P(NGInlineCursorTest, CulledInlineWithFloat) {
   SetBodyInnerHTML(
@@ -228,23 +237,27 @@
     list.push_back(ToDebugString(cursor));
     cursor.MoveToNextForSameLayoutObject();
   }
-  EXPECT_THAT(list, ElementsAre("abc", "xyz"))
-      << "We should not have float:right fragment, because it isn't in-flow in "
-         "an inline formatting context.";
+  if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled())
+    EXPECT_THAT(list, ElementsAre("#culled"));
+  else
+    EXPECT_THAT(list, ElementsAre("abc", "xyz"));
 }
 
 TEST_P(NGInlineCursorTest, CulledInlineWithRoot) {
-  NGInlineCursor cursor =
-      SetupCursor("<div id=root><a><b>abc</b><br><i>xyz</i></a></div>");
-  const LayoutInline& layout_inline =
-      ToLayoutInline(*cursor.GetLayoutBlockFlow()->FirstChild());
-  cursor.MoveTo(layout_inline);
+  NGInlineCursor cursor = SetupCursor(R"HTML(
+    <div id="root"><a id="a"><b>abc</b><br><i>xyz</i></a></div>
+  )HTML");
+  const LayoutObject* layout_inline_a = GetLayoutObjectByElementId("a");
+  cursor.MoveTo(*layout_inline_a);
   Vector<String> list;
   while (cursor) {
     list.push_back(ToDebugString(cursor));
     cursor.MoveToNextForSameLayoutObject();
   }
-  EXPECT_THAT(list, ElementsAre("abc", "", "xyz"));
+  if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled())
+    EXPECT_THAT(list, ElementsAre("#a", "#a"));
+  else
+    EXPECT_THAT(list, ElementsAre("abc", "", "xyz"));
 }
 
 TEST_P(NGInlineCursorTest, CulledInlineWithoutRoot) {
@@ -259,7 +272,10 @@
     list.push_back(ToDebugString(cursor));
     cursor.MoveToNextForSameLayoutObject();
   }
-  EXPECT_THAT(list, ElementsAre("abc", "", "xyz"));
+  if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled())
+    EXPECT_THAT(list, ElementsAre("#a", "#a"));
+  else
+    EXPECT_THAT(list, ElementsAre("abc", "", "xyz"));
 }
 
 TEST_P(NGInlineCursorTest, FirstChild) {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index e7e454a..98dbd08 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -105,10 +105,14 @@
     box->EnsureTextMetrics(*item.Style(), baseline_type_);
   box = box_states_->OnCloseTag(&line_box_, box, baseline_type_,
                                 item.HasEndEdge());
-  // Just clear |NeedsLayout| flags. Culled inline boxes do not need paint
-  // invalidations. If this object produces box fragments,
-  // |NGInlineBoxStateStack| takes care of invalidations.
-  item.GetLayoutObject()->ClearNeedsLayoutWithoutPaintInvalidation();
+  if (!RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
+    // Just clear |NeedsLayout| flags. Culled inline boxes do not need paint
+    // invalidations. If this object produces box fragments,
+    // |NGInlineBoxStateStack| takes care of invalidations.
+    item.GetLayoutObject()->ClearNeedsLayoutWithoutPaintInvalidation();
+  } else {
+    item.GetLayoutObject()->ClearNeedsLayout();
+  }
   return box;
 }
 
@@ -547,7 +551,7 @@
     if (box->StyleRef().IsOriginalDisplayInlineType()) {
       // An inline-level OOF element positions itself within the line, at the
       // position it would have been if it was in-flow.
-      static_offset.inline_offset = child.offset.inline_offset;
+      static_offset.inline_offset = child.rect.offset.inline_offset;
 
       // The static-position of inline-level OOF-positioned nodes depends on
       // previous floats (if any).
@@ -571,7 +575,7 @@
       }
     }
 
-    child.offset = static_offset;
+    child.rect.offset = static_offset;
   }
 
   if (UNLIKELY(has_rtl_block_level_out_of_flow_objects)) {
@@ -584,7 +588,7 @@
       }
       if (has_preceding_inline_level_content &&
           !box->StyleRef().IsOriginalDisplayInlineType()) {
-        child.offset.block_offset += line_height;
+        child.rect.offset.block_offset += line_height;
       }
     }
   }
@@ -645,8 +649,8 @@
       block_offset = -fragment.BlockSize() - block_offset;
     }
 
-    child.offset = {child.bfc_offset.line_offset - bfc_line_offset,
-                    block_offset};
+    child.rect.offset = {child.bfc_offset.line_offset - bfc_line_offset,
+                         block_offset};
   }
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
index bad0de9..036d6464 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
@@ -57,14 +57,27 @@
   return nullptr;
 }
 
+void NGLineBoxFragmentBuilder::ChildList::WillInsertChild(
+    unsigned insert_before) {
+  unsigned index = 0;
+  for (Child& child : children_) {
+    if (index >= insert_before)
+      break;
+    if (child.children_count && index + child.children_count > insert_before)
+      ++child.children_count;
+    ++index;
+  }
+}
+
 void NGLineBoxFragmentBuilder::ChildList::InsertChild(unsigned index) {
+  WillInsertChild(index);
   children_.insert(index, Child());
 }
 
 void NGLineBoxFragmentBuilder::ChildList::MoveInInlineDirection(
     LayoutUnit delta) {
   for (auto& child : children_)
-    child.offset.inline_offset += delta;
+    child.rect.offset.inline_offset += delta;
 }
 
 void NGLineBoxFragmentBuilder::ChildList::MoveInInlineDirection(
@@ -72,20 +85,20 @@
     unsigned start,
     unsigned end) {
   for (unsigned index = start; index < end; index++)
-    children_[index].offset.inline_offset += delta;
+    children_[index].rect.offset.inline_offset += delta;
 }
 
 void NGLineBoxFragmentBuilder::ChildList::MoveInBlockDirection(
     LayoutUnit delta) {
   for (auto& child : children_)
-    child.offset.block_offset += delta;
+    child.rect.offset.block_offset += delta;
 }
 
 void NGLineBoxFragmentBuilder::ChildList::MoveInBlockDirection(LayoutUnit delta,
                                                                unsigned start,
                                                                unsigned end) {
   for (unsigned index = start; index < end; index++)
-    children_[index].offset.block_offset += delta;
+    children_[index].rect.offset.block_offset += delta;
 }
 
 void NGLineBoxFragmentBuilder::AddChildren(ChildList& children) {
@@ -94,15 +107,15 @@
   for (auto& child : children) {
     if (child.layout_result) {
       DCHECK(!child.fragment);
-      AddChild(child.layout_result->PhysicalFragment(), child.offset);
+      AddChild(child.layout_result->PhysicalFragment(), child.Offset());
       child.layout_result.reset();
     } else if (child.fragment) {
-      AddChild(std::move(child.fragment), child.offset);
+      AddChild(std::move(child.fragment), child.Offset());
       DCHECK(!child.fragment);
     } else if (child.out_of_flow_positioned_box) {
       AddOutOfFlowInlineChildCandidate(
           NGBlockNode(ToLayoutBox(child.out_of_flow_positioned_box)),
-          child.offset, child.container_direction);
+          child.Offset(), child.container_direction);
       child.out_of_flow_positioned_box = nullptr;
     }
   }
@@ -119,17 +132,18 @@
         // fragment item list. Because they are not necessary for inline
         // traversals, and leading floating objects are still in the fragment
         // tree, this helps simplifying painting floats.
-        AddChild(fragment, child.offset);
+        AddChild(fragment, child.Offset());
         child.layout_result.reset();
         continue;
       }
-      PropagateChildData(child.layout_result->PhysicalFragment(), child.offset);
+      PropagateChildData(child.layout_result->PhysicalFragment(),
+                         child.Offset());
       continue;
     }
     if (child.out_of_flow_positioned_box) {
       AddOutOfFlowInlineChildCandidate(
           NGBlockNode(ToLayoutBox(child.out_of_flow_positioned_box)),
-          child.offset, child.container_direction);
+          child.Offset(), child.container_direction);
       child.out_of_flow_positioned_box = nullptr;
     }
   }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
index 0f75cbff..06eebe98 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_LINE_BOX_FRAGMENT_BUILDER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_LINE_BOX_FRAGMENT_BUILDER_H_
 
-#include "third_party/blink/renderer/core/layout/geometry/logical_offset.h"
+#include "third_party/blink/renderer/core/layout/geometry/logical_rect.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_break_token.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h"
@@ -77,12 +77,12 @@
 
     scoped_refptr<const NGLayoutResult> layout_result;
     scoped_refptr<const NGPhysicalTextFragment> fragment;
+    const NGInlineItem* inline_item = nullptr;
     LayoutObject* out_of_flow_positioned_box = nullptr;
     LayoutObject* unpositioned_float = nullptr;
     // The offset of the border box, initially in this child coordinate system.
     // |ComputeInlinePositions()| converts it to the offset within the line box.
-    LogicalOffset offset;
-    LogicalSize size;
+    LogicalRect rect;
     // The offset of a positioned float wrt. the root BFC. This should only be
     // set for positioned floats.
     NGBfcOffset bfc_offset;
@@ -105,7 +105,7 @@
     // Create a placeholder. A placeholder does not have a fragment nor a bidi
     // level.
     Child(LayoutUnit block_offset, LayoutUnit block_size)
-        : offset(LayoutUnit(), block_offset), size(LayoutUnit(), block_size) {}
+        : rect(LayoutUnit(), block_offset, LayoutUnit(), block_size) {}
     // Crete a bidi control. A bidi control does not have a fragment, but has
     // bidi level and affects bidi reordering.
     Child(UBiDiLevel bidi_level) : bidi_level(bidi_level) {}
@@ -116,7 +116,7 @@
           unsigned children_count,
           UBiDiLevel bidi_level)
         : layout_result(std::move(layout_result)),
-          offset(offset),
+          rect(offset, LogicalSize()),
           inline_size(inline_size),
           children_count(children_count),
           bidi_level(bidi_level) {}
@@ -126,7 +126,7 @@
           LayoutUnit inline_size,
           UBiDiLevel bidi_level)
         : fragment(std::move(fragment)),
-          offset(offset),
+          rect(offset, LogicalSize()),
           inline_size(inline_size),
           bidi_level(bidi_level) {}
     Child(scoped_refptr<const NGPhysicalTextFragment> fragment,
@@ -134,7 +134,7 @@
           LayoutUnit inline_size,
           UBiDiLevel bidi_level)
         : fragment(std::move(fragment)),
-          offset({LayoutUnit(), block_offset}),
+          rect(LayoutUnit(), block_offset, LayoutUnit(), LayoutUnit()),
           inline_size(inline_size),
           bidi_level(bidi_level) {}
     // Create an out-of-flow positioned object.
@@ -184,6 +184,9 @@
       }
       return false;
     }
+    const LogicalOffset& Offset() const { return rect.offset; }
+    LayoutUnit InlineOffset() const { return rect.offset.inline_offset; }
+    const LogicalSize& Size() const { return rect.size; }
     const NGPhysicalFragment* PhysicalFragment() const {
       if (layout_result)
         return &layout_result->PhysicalFragment();
@@ -246,6 +249,7 @@
                      scoped_refptr<const NGLayoutResult> layout_result,
                      const LogicalOffset& offset,
                      unsigned children_count) {
+      WillInsertChild(index);
       children_.insert(index, Child{std::move(layout_result), offset,
                                     /* inline_size */ LayoutUnit(),
                                     children_count, /* bidi_level */ 0});
@@ -257,6 +261,8 @@
     void MoveInBlockDirection(LayoutUnit, unsigned start, unsigned end);
 
    private:
+    void WillInsertChild(unsigned index);
+
     Vector<Child, 16> children_;
   };
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc
index d5db3b4..d04a5092 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc
@@ -87,7 +87,7 @@
                                      : truncated_fragment->Size().height;
     DCHECK_LE(new_inline_size, ellpisized_child->inline_size);
     if (UNLIKELY(IsRtl(line_direction_))) {
-      ellpisized_child->offset.inline_offset +=
+      ellpisized_child->rect.offset.inline_offset +=
           ellpisized_child->inline_size - new_inline_size;
     }
     ellpisized_child->inline_size = new_inline_size;
@@ -109,9 +109,8 @@
   // line box.
   LayoutUnit ellipsis_inline_offset =
       IsLtr(line_direction_)
-          ? ellpisized_child->offset.inline_offset +
-                ellpisized_child->inline_size
-          : ellpisized_child->offset.inline_offset - ellipsis_width;
+          ? ellpisized_child->InlineOffset() + ellpisized_child->inline_size
+          : ellpisized_child->InlineOffset() - ellipsis_width;
   FontBaseline baseline_type = line_style_->GetFontBaseline();
   NGLineHeightMetrics ellipsis_metrics(font_data->GetFontMetrics(),
                                        baseline_type);
@@ -147,7 +146,7 @@
       // paddings, because clipping is at the content box but ellipsizing is at
       // the padding box. Just move to the max because we don't know paddings,
       // and max should do what we need.
-      child->offset.inline_offset = LayoutUnit::NearlyMax();
+      child->rect.offset.inline_offset = LayoutUnit::NearlyMax();
       return;
     }
 
@@ -182,8 +181,8 @@
   // Can't place ellipsis if this child is completely outside of the box.
   LayoutUnit child_inline_offset =
       IsLtr(line_direction_)
-          ? child->offset.inline_offset
-          : line_width - (child->offset.inline_offset + child->inline_size);
+          ? child->InlineOffset()
+          : line_width - (child->InlineOffset() + child->inline_size);
   LayoutUnit space_for_child = available_width_ - child_inline_offset;
   if (space_for_child <= 0) {
     // This child is outside of the content box, but we still need to hide it.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index e6ae2b5d..794cd5e4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -1386,4 +1386,8 @@
   box_->SetMargin(physical_margins);
 }
 
+void NGBlockNode::StoreMargins(const NGPhysicalBoxStrut& physical_margins) {
+  box_->SetMargin(physical_margins);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.h b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
index 91b69867..57a2e58 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
@@ -136,6 +136,7 @@
 
   // Write back resolved margins to legacy.
   void StoreMargins(const NGConstraintSpace&, const NGBoxStrut& margins);
+  void StoreMargins(const NGPhysicalBoxStrut& margins);
 
   static bool CanUseNewLayout(const LayoutBox&);
   bool CanUseNewLayout() const;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
index 68c3144..f689dd07 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -404,15 +404,6 @@
     LayoutUnit flex_base_content_size =
         flex_base_border_box - main_axis_border_padding;
 
-    NGPhysicalBoxStrut physical_child_margins =
-        ComputePhysicalMargins(child_space, child_style);
-    // Set margin because FlexibleBoxAlgorithm reads it from legacy.
-    child.GetLayoutBox()->SetMargin(physical_child_margins);
-
-    LayoutUnit main_axis_margin = is_horizontal_flow_
-                                      ? physical_child_margins.HorizontalSum()
-                                      : physical_child_margins.VerticalSum();
-
     MinMaxSize min_max_sizes_in_main_axis_direction{LayoutUnit(),
                                                     LayoutUnit::Max()};
     MinMaxSize min_max_sizes_in_cross_axis_direction{LayoutUnit(),
@@ -522,11 +513,15 @@
     }
     // TODO(dgrogan): Should this include scrollbar?
     min_max_sizes_in_main_axis_direction -= main_axis_border_scrollbar_padding;
+
+    NGPhysicalBoxStrut physical_child_margins =
+        ComputePhysicalMargins(child_space, child_style);
     algorithm_
-        ->emplace_back(child.GetLayoutBox(), flex_base_content_size,
+        ->emplace_back(child.GetLayoutBox(), child.Style(),
+                       flex_base_content_size,
                        min_max_sizes_in_main_axis_direction,
                        min_max_sizes_in_cross_axis_direction,
-                       main_axis_border_padding, main_axis_margin)
+                       main_axis_border_padding, physical_child_margins)
         .ng_input_node = child;
   }
 }
@@ -767,6 +762,7 @@
                                  : flex_item.desired_location;
       container_builder_.AddChild(flex_item.layout_result->PhysicalFragment(),
                                   {location.X(), location.Y()});
+      flex_item.ng_input_node.StoreMargins(flex_item.physical_margins);
     }
   }
 }
diff --git a/third_party/blink/renderer/core/loader/ping_loader_test.cc b/third_party/blink/renderer/core/loader/ping_loader_test.cc
index ac71a79..86454344 100644
--- a/third_party/blink/renderer/core/loader/ping_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/ping_loader_test.cc
@@ -19,6 +19,27 @@
 
 namespace {
 
+class PartialResourceRequest {
+ public:
+  PartialResourceRequest() : PartialResourceRequest(ResourceRequest()) {}
+  PartialResourceRequest(const ResourceRequest& request)
+      : url_(request.Url()), priority_(request.Priority()) {
+    http_header_fields_.Adopt(request.HttpHeaderFields().CopyData());
+  }
+
+  bool IsNull() const { return url_.IsNull(); }
+  const KURL& Url() const { return url_; }
+  const AtomicString& HttpHeaderField(const AtomicString& name) const {
+    return http_header_fields_.Get(name);
+  }
+  ResourceLoadPriority Priority() const { return priority_; }
+
+ private:
+  KURL url_;
+  HTTPHeaderMap http_header_fields_;
+  ResourceLoadPriority priority_;
+};
+
 class PingLocalFrameClient : public EmptyLocalFrameClient {
  public:
   std::unique_ptr<WebURLLoaderFactory> CreateURLLoaderFactory() override {
@@ -27,13 +48,13 @@
 
   void DispatchWillSendRequest(ResourceRequest& request) override {
     if (request.GetKeepalive())
-      ping_request_ = request;
+      ping_request_ = PartialResourceRequest(request);
   }
 
-  const ResourceRequest& PingRequest() const { return ping_request_; }
+  const PartialResourceRequest& PingRequest() const { return ping_request_; }
 
  private:
-  ResourceRequest ping_request_;
+  PartialResourceRequest ping_request_;
 };
 
 class PingLoaderTest : public PageTestBase {
@@ -55,14 +76,14 @@
     ASSERT_EQ(url.GetString(), GetDocument().Url().GetString());
   }
 
-  const ResourceRequest& PingAndGetRequest(const KURL& ping_url) {
+  const PartialResourceRequest& PingAndGetRequest(const KURL& ping_url) {
     KURL destination_url("http://navigation.destination");
     // TODO(crbug.com/751425): We should use the mock functionality
     // via |PageTestBase::dummy_page_holder_|.
     url_test_helpers::RegisterMockedURLLoad(
         ping_url, test::CoreTestDataPath("bar.html"), "text/html");
     PingLoader::SendLinkAuditPing(&GetFrame(), ping_url, destination_url);
-    const ResourceRequest& ping_request = client_->PingRequest();
+    const PartialResourceRequest& ping_request = client_->PingRequest();
     if (!ping_request.IsNull()) {
       EXPECT_EQ(destination_url.GetString(),
                 ping_request.HttpHeaderField("Ping-To"));
@@ -80,7 +101,7 @@
 TEST_F(PingLoaderTest, HTTPSToHTTPS) {
   KURL ping_url("https://localhost/bar.html");
   SetDocumentURL(KURL("https://127.0.0.1:8000/foo.html"));
-  const ResourceRequest& ping_request = PingAndGetRequest(ping_url);
+  const PartialResourceRequest& ping_request = PingAndGetRequest(ping_url);
   ASSERT_FALSE(ping_request.IsNull());
   EXPECT_EQ(ping_url, ping_request.Url());
   EXPECT_EQ(String(), ping_request.HttpHeaderField("Ping-From"));
@@ -90,7 +111,7 @@
   KURL document_url("http://127.0.0.1:8000/foo.html");
   KURL ping_url("https://localhost/bar.html");
   SetDocumentURL(document_url);
-  const ResourceRequest& ping_request = PingAndGetRequest(ping_url);
+  const PartialResourceRequest& ping_request = PingAndGetRequest(ping_url);
   ASSERT_FALSE(ping_request.IsNull());
   EXPECT_EQ(ping_url, ping_request.Url());
   EXPECT_EQ(document_url.GetString(),
@@ -99,7 +120,7 @@
 
 TEST_F(PingLoaderTest, NonHTTPPingTarget) {
   SetDocumentURL(KURL("http://127.0.0.1:8000/foo.html"));
-  const ResourceRequest& ping_request =
+  const PartialResourceRequest& ping_request =
       PingAndGetRequest(KURL("ftp://localhost/bar.html"));
   ASSERT_TRUE(ping_request.IsNull());
 }
@@ -115,7 +136,7 @@
       ping_url, test::CoreTestDataPath("bar.html"), "text/html");
   PingLoader::SendLinkAuditPing(&GetFrame(), ping_url, destination_url);
   url_test_helpers::ServeAsynchronousRequests();
-  const ResourceRequest& request = client_->PingRequest();
+  const PartialResourceRequest& request = client_->PingRequest();
   ASSERT_FALSE(request.IsNull());
   ASSERT_EQ(request.Url(), ping_url);
   EXPECT_EQ(ResourceLoadPriority::kVeryLow, request.Priority());
@@ -132,7 +153,7 @@
   PingLoader::SendViolationReport(&GetFrame(), ping_url,
                                   EncodedFormData::Create());
   url_test_helpers::ServeAsynchronousRequests();
-  const ResourceRequest& request = client_->PingRequest();
+  const PartialResourceRequest& request = client_->PingRequest();
   ASSERT_FALSE(request.IsNull());
   ASSERT_EQ(request.Url(), ping_url);
   EXPECT_EQ(ResourceLoadPriority::kVeryLow, request.Priority());
@@ -148,7 +169,7 @@
       ping_url, test::CoreTestDataPath("bar.html"), "text/html");
   PingLoader::SendBeacon(&GetFrame(), ping_url, "hello");
   url_test_helpers::ServeAsynchronousRequests();
-  const ResourceRequest& request = client_->PingRequest();
+  const PartialResourceRequest& request = client_->PingRequest();
   ASSERT_FALSE(request.IsNull());
   ASSERT_EQ(request.Url(), ping_url);
   EXPECT_EQ(ResourceLoadPriority::kVeryLow, request.Priority());
diff --git a/third_party/blink/renderer/core/paint/document_marker_painter.cc b/third_party/blink/renderer/core/paint/document_marker_painter.cc
index 41bd8af..21521e76 100644
--- a/third_party/blink/renderer/core/paint/document_marker_painter.cc
+++ b/third_party/blink/renderer/core/paint/document_marker_painter.cc
@@ -210,7 +210,7 @@
   // place the underline at the bottom of the text, but in larger fonts that's
   // not so good so we pin to two pixels under the baseline.
   float zoom = style.EffectiveZoom();
-  int line_thickness = kMarkerHeight * zoom;
+  int line_thickness = static_cast<int>(ceilf(kMarkerHeight * zoom));
 
   const SimpleFontData* font_data = style.GetFont().PrimaryFont();
   DCHECK(font_data);
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index 3c19540d..32166a04 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -1708,6 +1708,27 @@
                                  physical_offset, hit_test.action);
 }
 
+bool NGBoxFragmentPainter::HitTestChildBoxItem(
+    const HitTestContext& hit_test,
+    const NGFragmentItem& item,
+    const NGInlineBackwardCursor& cursor) {
+  DCHECK_EQ(&item, cursor.CurrentItem());
+
+  if (const NGPhysicalBoxFragment* child_fragment = item.BoxFragment()) {
+    const PhysicalOffset child_offset =
+        hit_test.inline_root_offset + item.Offset();
+    return HitTestChildBoxFragment(hit_test, *child_fragment, cursor,
+                                   child_offset);
+  }
+
+  DCHECK(item.GetLayoutObject()->IsLayoutInline());
+  DCHECK(!ToLayoutInline(item.GetLayoutObject())->ShouldCreateBoxFragment());
+  if (NGInlineCursor descendants = cursor.CursorForDescendants())
+    return HitTestItemsChildren(hit_test, descendants);
+
+  return false;
+}
+
 bool NGBoxFragmentPainter::HitTestChildren(
     const HitTestContext& hit_test,
     const PhysicalOffset& accumulated_offset) {
@@ -1813,20 +1834,13 @@
                                  child_offset))
         return true;
     } else if (item->Type() == NGFragmentItem::kBox) {
-      if (const NGPhysicalBoxFragment* child_fragment = item->BoxFragment()) {
-        const PhysicalOffset child_offset =
-            hit_test.inline_root_offset + item->Offset();
-        if (HitTestChildBoxFragment(hit_test, *child_fragment, cursor,
-                                    child_offset))
-          return true;
-      }
+      if (HitTestChildBoxItem(hit_test, *item, cursor))
+        return true;
     } else {
       NOTREACHED();
     }
 
     cursor.MoveToPreviousSibling();
-
-    // TODO(kojii): Implement hit-testing culled inline box.
   }
 
   return false;
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
index b60d84b..759fc0a 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
@@ -210,6 +210,9 @@
                                const NGPhysicalBoxFragment& fragment,
                                const NGInlineBackwardCursor& cursor,
                                const PhysicalOffset& physical_offset);
+  bool HitTestChildBoxItem(const HitTestContext& hit_test,
+                           const NGFragmentItem& item,
+                           const NGInlineBackwardCursor& cursor);
 
   // Hit tests the given text fragment.
   // @param physical_offset Physical offset of the text fragment in paint layer.
diff --git a/third_party/blink/renderer/modules/DEPS b/third_party/blink/renderer/modules/DEPS
index 7ecc390..947b00f 100644
--- a/third_party/blink/renderer/modules/DEPS
+++ b/third_party/blink/renderer/modules/DEPS
@@ -3,6 +3,7 @@
     "+base/memory/scoped_refptr.h",
     "+base/strings/char_traits.h",
     "+mojo/public/cpp/bindings",
+    "+mojo/public/cpp/system",
     "+services/network/public/cpp/shared_url_loader_factory.h",
     "+services/service_manager/public/mojom/interface_provider.mojom-blink.h",
     "+services/service_manager/public/mojom/interface_provider.mojom-blink-forward.h",
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc
index d940c45..6ec8341 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc
@@ -4,13 +4,14 @@
 
 #include "third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.h"
 
-#include "base/bind.h"
 #include "base/strings/stringprintf.h"
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
 #include "third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h"
 #include "third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.h"
 #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 
 namespace {
 
@@ -91,10 +92,10 @@
 void WebRtcMediaStreamTrackAdapterTraits::Destruct(
     const WebRtcMediaStreamTrackAdapter* adapter) {
   if (!adapter->main_thread_->BelongsToCurrentThread()) {
-    adapter->main_thread_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&WebRtcMediaStreamTrackAdapterTraits::Destruct,
-                       base::Unretained(adapter)));
+    PostCrossThreadTask(
+        *adapter->main_thread_.get(), FROM_HERE,
+        CrossThreadBindOnce(&WebRtcMediaStreamTrackAdapterTraits::Destruct,
+                            CrossThreadUnretained(adapter)));
     return;
   }
   delete adapter;
@@ -232,11 +233,11 @@
   // http://crbug.com/810848
   webrtc_audio_track->GetSource()->SetVolume(0);
   remote_track_can_complete_initialization_.Signal();
-  main_thread_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WebRtcMediaStreamTrackAdapter::
-                         FinalizeRemoteTrackInitializationOnMainThread,
-                     this));
+  PostCrossThreadTask(
+      *main_thread_.get(), FROM_HERE,
+      CrossThreadBindOnce(&WebRtcMediaStreamTrackAdapter::
+                              FinalizeRemoteTrackInitializationOnMainThread,
+                          WrapRefCounted(this)));
 }
 
 void WebRtcMediaStreamTrackAdapter::InitializeRemoteVideoTrack(
@@ -250,11 +251,11 @@
           main_thread_, webrtc_video_track.get());
   webrtc_track_ = webrtc_video_track;
   remote_track_can_complete_initialization_.Signal();
-  main_thread_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WebRtcMediaStreamTrackAdapter::
-                         FinalizeRemoteTrackInitializationOnMainThread,
-                     this));
+  PostCrossThreadTask(
+      *main_thread_.get(), FROM_HERE,
+      CrossThreadBindOnce(&WebRtcMediaStreamTrackAdapter::
+                              FinalizeRemoteTrackInitializationOnMainThread,
+                          WrapRefCounted(this)));
 }
 
 void WebRtcMediaStreamTrackAdapter::
@@ -314,11 +315,12 @@
   DCHECK(remote_audio_track_adapter_);
   DCHECK_EQ(web_track_.Source().GetType(),
             blink::WebMediaStreamSource::kTypeAudio);
-  factory_->GetWebRtcSignalingTaskRunner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WebRtcMediaStreamTrackAdapter::
-                         UnregisterRemoteAudioTrackAdapterOnSignalingThread,
-                     this));
+  PostCrossThreadTask(
+      *factory_->GetWebRtcSignalingTaskRunner().get(), FROM_HERE,
+      CrossThreadBindOnce(
+          &WebRtcMediaStreamTrackAdapter::
+              UnregisterRemoteAudioTrackAdapterOnSignalingThread,
+          WrapRefCounted(this)));
 }
 
 void WebRtcMediaStreamTrackAdapter::DisposeRemoteVideoTrack() {
@@ -334,10 +336,11 @@
   DCHECK(!main_thread_->BelongsToCurrentThread());
   DCHECK(remote_audio_track_adapter_);
   remote_audio_track_adapter_->Unregister();
-  main_thread_->PostTask(
-      FROM_HERE, base::BindOnce(&WebRtcMediaStreamTrackAdapter::
-                                    FinalizeRemoteTrackDisposingOnMainThread,
-                                this));
+  PostCrossThreadTask(
+      *main_thread_.get(), FROM_HERE,
+      CrossThreadBindOnce(&WebRtcMediaStreamTrackAdapter::
+                              FinalizeRemoteTrackDisposingOnMainThread,
+                          WrapRefCounted(this)));
 }
 
 void WebRtcMediaStreamTrackAdapter::FinalizeRemoteTrackDisposingOnMainThread() {
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_orientation.cc b/third_party/blink/renderer/modules/screen_orientation/screen_orientation.cc
index 79c43ee..6a4902b 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_orientation.cc
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_orientation.cc
@@ -148,22 +148,22 @@
 }
 
 ScriptPromise ScreenOrientation::lock(ScriptState* state,
-                                      const AtomicString& lock_string) {
+                                      const AtomicString& lock_string,
+                                      ExceptionState& exception_state) {
   Document* document = GetFrame() ? GetFrame()->GetDocument() : nullptr;
 
   if (!document || !Controller()) {
-    return ScriptPromise::RejectWithDOMException(
-        state, MakeGarbageCollected<DOMException>(
-                   DOMExceptionCode::kInvalidStateError,
-                   "The object is no longer associated to a document."));
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidStateError,
+        "The object is no longer associated to a document.");
+    return ScriptPromise();
   }
 
   if (document->IsSandboxed(WebSandboxFlags::kOrientationLock)) {
-    return ScriptPromise::RejectWithDOMException(
-        state, MakeGarbageCollected<DOMException>(
-                   DOMExceptionCode::kSecurityError,
-                   "The document is sandboxed and lacks the "
-                   "'allow-orientation-lock' flag."));
+    exception_state.ThrowSecurityError(
+        "The document is sandboxed and lacks the "
+        "'allow-orientation-lock' flag.");
+    return ScriptPromise();
   }
 
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(state);
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_orientation.h b/third_party/blink/renderer/modules/screen_orientation/screen_orientation.h
index 4464944d..9fb46dd 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_orientation.h
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_orientation.h
@@ -15,6 +15,7 @@
 
 namespace blink {
 
+class ExceptionState;
 class ExecutionContext;
 class LocalFrame;
 class ScriptPromise;
@@ -42,7 +43,9 @@
   void SetType(WebScreenOrientationType);
   void SetAngle(uint16_t);
 
-  ScriptPromise lock(ScriptState*, const AtomicString& orientation);
+  ScriptPromise lock(ScriptState*,
+                     const AtomicString& orientation,
+                     ExceptionState&);
   void unlock();
 
   DEFINE_ATTRIBUTE_EVENT_LISTENER(change, kChange)
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_orientation.idl b/third_party/blink/renderer/modules/screen_orientation/screen_orientation.idl
index 16cd1dbb..81384ba 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_orientation.idl
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_orientation.idl
@@ -27,7 +27,7 @@
     [MeasureAs=ScreenOrientationAngle] readonly attribute unsigned short angle;
     [MeasureAs=ScreenOrientationType] readonly attribute DOMString type;
 
-    [CallWith=ScriptState, MeasureAs=ScreenOrientationLock] Promise<void> lock(OrientationLockType orientation);
+    [CallWith=ScriptState, MeasureAs=ScreenOrientationLock, RaisesException] Promise<void> lock(OrientationLockType orientation);
     [MeasureAs=ScreenOrientationUnlock] void unlock();
 
     attribute EventHandler onchange;
diff --git a/third_party/blink/renderer/modules/webtransport/quic_transport.h b/third_party/blink/renderer/modules/webtransport/quic_transport.h
index 39a3554..885958a 100644
--- a/third_party/blink/renderer/modules/webtransport/quic_transport.h
+++ b/third_party/blink/renderer/modules/webtransport/quic_transport.h
@@ -10,6 +10,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/system/data_pipe.h"
 #include "services/network/public/mojom/quic_transport.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/webtransport/quic_transport_test.cc b/third_party/blink/renderer/modules/webtransport/quic_transport_test.cc
index a1015fa..4f9b380 100644
--- a/third_party/blink/renderer/modules/webtransport/quic_transport_test.cc
+++ b/third_party/blink/renderer/modules/webtransport/quic_transport_test.cc
@@ -71,6 +71,20 @@
   void SendDatagram(base::span<const uint8_t> data,
                     base::OnceCallback<void(bool)> callback) override {}
 
+  void CreateStream(
+      mojo::ScopedDataPipeConsumerHandle readable,
+      mojo::ScopedDataPipeProducerHandle writable,
+      base::OnceCallback<void(bool, uint32_t)> callback) override {}
+
+  void AcceptBidirectionalStream(
+      base::OnceCallback<void(uint32_t,
+                              mojo::ScopedDataPipeConsumerHandle,
+                              mojo::ScopedDataPipeProducerHandle)>) override {}
+
+  void AcceptUnidirectionalStream(
+      base::OnceCallback<void(uint32_t, mojo::ScopedDataPipeConsumerHandle)>)
+      override {}
+
  private:
   mojo::Receiver<network::mojom::blink::QuicTransport> receiver_;
 };
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index d4e3b42..deab500 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1210,6 +1210,7 @@
     "mediastream/media_stream_source.h",
     "mediastream/media_stream_web_audio_source.cc",
     "mediastream/media_stream_web_audio_source.h",
+    "mediastream/webaudio_destination_consumer.h",
     "mediastream/webaudio_media_stream_source.cc",
     "mediastream/webaudio_media_stream_source.h",
     "mediastream/webrtc_uma_histograms.cc",
diff --git a/third_party/blink/renderer/platform/exported/web_media_stream_source.cc b/third_party/blink/renderer/platform/exported/web_media_stream_source.cc
index 269b1d78..27e4fda4 100644
--- a/third_party/blink/renderer/platform/exported/web_media_stream_source.cc
+++ b/third_party/blink/renderer/platform/exported/web_media_stream_source.cc
@@ -34,12 +34,12 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "third_party/blink/public/platform/web_audio_destination_consumer.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/platform/audio/audio_bus.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/mediastream/media_constraints.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
+#include "third_party/blink/renderer/platform/mediastream/webaudio_destination_consumer.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
@@ -182,7 +182,7 @@
 
   // Wrap AudioBus.
   size_t number_of_channels = bus->NumberOfChannels();
-  WebVector<const float*> bus_vector(number_of_channels);
+  Vector<const float*> bus_vector(number_of_channels);
   for (size_t i = 0; i < number_of_channels; ++i)
     bus_vector[i] = bus->Channel(i)->Data();
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc b/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
index 9f5346c..6b28c4858 100644
--- a/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
@@ -173,8 +173,8 @@
   RevalidationStartForbiddenScope revalidation_start_forbidden_scope(this);
   RawResourceClient* client = static_cast<RawResourceClient*>(c);
   for (const auto& redirect : RedirectChain()) {
-    ResourceRequest request(redirect.request_);
-    client->RedirectReceived(this, request, redirect.redirect_response_);
+    client->RedirectReceived(this, redirect.request_,
+                             redirect.redirect_response_);
     if (!HasClient(c))
       return;
   }
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource.h b/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
index 3c0fc518..3a22921 100644
--- a/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
@@ -63,7 +63,7 @@
                                     RawResourceClient*);
 
   // Exposed for testing
-  static RawResource* CreateForTest(ResourceRequest request,
+  static RawResource* CreateForTest(const ResourceRequest& request,
                                     ResourceType type) {
     ResourceLoaderOptions options;
     return MakeGarbageCollected<RawResource>(request, type, options);
diff --git a/third_party/blink/public/platform/web_audio_destination_consumer.h b/third_party/blink/renderer/platform/mediastream/webaudio_destination_consumer.h
similarity index 82%
rename from third_party/blink/public/platform/web_audio_destination_consumer.h
rename to third_party/blink/renderer/platform/mediastream/webaudio_destination_consumer.h
index 57cba431..d6184f9 100644
--- a/third_party/blink/public/platform/web_audio_destination_consumer.h
+++ b/third_party/blink/renderer/platform/mediastream/webaudio_destination_consumer.h
@@ -22,10 +22,10 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_AUDIO_DESTINATION_CONSUMER_H_
-#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_AUDIO_DESTINATION_CONSUMER_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIASTREAM_WEBAUDIO_DESTINATION_CONSUMER_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIASTREAM_WEBAUDIO_DESTINATION_CONSUMER_H_
 
-#include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
@@ -38,10 +38,10 @@
   // The size of the vector is the number of audio channels, and
   // |number_of_frames| is the number of audio frames in the (possibly
   // multi-channel) buffer in a planar format.
-  virtual void ConsumeAudio(const WebVector<const float*>&,
+  virtual void ConsumeAudio(const Vector<const float*>&,
                             size_t number_of_frames) = 0;
 };
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_AUDIO_DESTINATION_CONSUMER_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIASTREAM_WEBAUDIO_DESTINATION_CONSUMER_H_
diff --git a/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.cc b/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.cc
index 7cf1fe2..7ae4e9e 100644
--- a/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.cc
+++ b/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.cc
@@ -84,7 +84,7 @@
 }
 
 void WebAudioMediaStreamSource::ConsumeAudio(
-    const WebVector<const float*>& audio_data,
+    const Vector<const float*>& audio_data,
     size_t number_of_frames) {
   // TODO(miu): Plumbing is needed to determine the actual capture timestamp
   // of the audio, instead of just snapshotting base::TimeTicks::Now(), for
diff --git a/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.h b/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.h
index e5de09a..afdfc6e7 100644
--- a/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.h
+++ b/third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.h
@@ -10,10 +10,10 @@
 #include "base/time/time.h"
 #include "media/base/audio_bus.h"
 #include "media/base/audio_push_fifo.h"
-#include "third_party/blink/public/platform/web_audio_destination_consumer.h"
 #include "third_party/blink/public/platform/web_media_stream_source.h"
 #include "third_party/blink/public/platform/web_vector.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h"
+#include "third_party/blink/renderer/platform/mediastream/webaudio_destination_consumer.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 
 namespace blink {
@@ -39,7 +39,7 @@
   // concurrently across threads, but these methods could be called on any
   // thread.
   void SetFormat(size_t number_of_channels, float sample_rate) override;
-  void ConsumeAudio(const WebVector<const float*>& audio_data,
+  void ConsumeAudio(const Vector<const float*>& audio_data,
                     size_t number_of_frames) override;
 
   // Called by AudioPushFifo zero or more times during the call to
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/linux.py b/third_party/blink/tools/blinkpy/web_tests/port/linux.py
index 7c6695d..fa695e17 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/linux.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/linux.py
@@ -76,6 +76,13 @@
         flags = super(LinuxPort, self).additional_driver_flags()
         if not self.get_option('disable_breakpad'):
             flags += ['--enable-crash-reporter', '--crash-dumps-dir=%s' % self._dump_reader.crash_dumps_directory()]
+        # SkiaRenderer is on by default on Linux. However it was relying on
+        # --fuzzy-diff for many tests to pass. This was obscuring other errors.
+        # While we work on rebaselining and retriaging SkiaRenderer, disable it
+        # for running the tests unless otherwise specified.
+        # TODO(crbug.com/1037835)
+        if '--enable-features=UseSkiaRenderer' not in flags:
+            flags += ['--disable-features=UseSkiaRenderer']
         return flags
 
     def check_build(self, needs_http, printer):
diff --git a/third_party/blink/web_tests/FlagExpectations/composite-after-paint b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
index d53fdf2..a8de3af 100644
--- a/third_party/blink/web_tests/FlagExpectations/composite-after-paint
+++ b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
@@ -225,3 +225,16 @@
 # These failures need to be triaged and are being added to unblock the CQ (see: https://crbug.com/966981).
 crbug.com/966981 virtual/threaded/fast/events/pinch/gesture-pinch-zoom-scroll-bubble.html [ Timeout ]
 crbug.com/966981 virtual/threaded-prefer-compositing/fast/scroll-behavior/overscroll-behavior.html [ Failure ]
+
+# Failures that appeared while fuzzy-diff was on. TODO(jonross) triage these and
+# update baselines as needed, or file more direct bugs.
+crbug.com/1039401 compositing/culling/tile-occlusion-boundaries.html [ Failure ]
+crbug.com/1039401 compositing/lots-of-img-layers-with-opacity.html [ Failure ]
+crbug.com/1039401 external/wpt/web-animations/timing-model/animations/update-playback-rate-slow.html [ Failure ]
+crbug.com/1039401 external/wpt/web-animations/timing-model/animations/update-playback-rate-zero.html [ Failure ]
+crbug.com/1039401 fast/backgrounds/size/contain-and-cover-zoomed.html [ Failure ]
+crbug.com/1039401 http/tests/devtools/a11y-axe-core/layers/layers-a11y-test.js [ Crash ]
+crbug.com/1039401 paint/invalidation/forms/select-option-background-color.html [ Failure ]
+crbug.com/1039401 virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125.html [ Failure ]
+crbug.com/1039401 virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ]
+crbug.com/1039401 virtual/scroll_customization/fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer b/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
index efbe44e..746a9a86 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
+++ b/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
@@ -8,3 +8,6 @@
 
 crbug.com/1027772 media/video-controls-visibility-multimodal-mouse-after-touch.html [ Failure Pass ]
 crbug.com/1027772 [ Win10 ] media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Failure Pass ]
+
+# Needs rebaseline.
+crbug.com/1039401 [ Linux ] css3/filters/effect-blur-hw.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 548cb4b..4d24e5b3 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -198,6 +198,7 @@
 crbug.com/623798 paint/images/animated-gif-last-frame-crash.html [ Slow ]
 
 crbug.com/606649 fast/dom/gc-dom-tree-lifetime.html [ Slow ]
+crbug.com/606649 virtual/web-components-v0-disabled/fast/dom/gc-dom-tree-lifetime.html [ Slow ]
 
 # Slow on Win Debug in part due to incremental linking.
 crbug.com/647192 [ Win Debug ] fast/css3-text/css3-word-break/word-break-all-ascii.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 228496d..a9fcac6a 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -7244,3 +7244,89 @@
 # Sheriff 2020-01-08
 crbug.com/850170 virtual/reporting-api/external/wpt/content-security-policy/reporting-api/reporting-api-doesnt-send-reports-without-violation.https.sub.html [ Pass Timeout ]
 crbug.com/1039643 [ Win ] external/wpt/content-security-policy/object-src/object-src-url-embed-allowed.html [ Pass Timeout ]
+
+# Failures that appeared while fuzzy-diff was on. TODO(jonross) triage these and
+# update baselines as needed, or file more direct bugs.
+crbug.com/1039401 [ Linux ] compositing/lots-of-img-layers.html [ Failure ]
+crbug.com/1039401 [ Linux ] css2.1/20110323/background-intrinsic-004.htm [ Failure ]
+crbug.com/1039401 [ Linux ] css2.1/20110323/background-intrinsic-005.htm [ Failure ]
+crbug.com/1039401 [ Linux ] editing/input/linux_ltr_composition_underline.html [ Failure ]
+crbug.com/1039401 [ Linux ] editing/input/linux_rtl_composition_underline.html [ Failure ]
+crbug.com/1039401 [ Linux ] editing/pasteboard/input-field-1.html [ Failure ]
+crbug.com/1039401 [ Linux ] editing/pasteboard/pasting-tabs.html [ Failure ]
+crbug.com/1039401 [ Linux ] editing/selection/replaced-boundaries-3.html [ Failure ]
+crbug.com/1039401 [ Linux ] editing/selection/select-box.html [ Failure ]
+crbug.com/1039401 [ Linux ] editing/selection/select-element-paragraph-boundary.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-default.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-composited.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-content-images.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image-image-document.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-from-image.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-none-content-images.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-none-image-document.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-images/image-orientation/image-orientation-none.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-text-decor/text-decoration-subelements-002.html [ Failure ]
+crbug.com/1039401 [ Linux ] external/wpt/css/css-text-decor/text-decoration-subelements-003.html [ Failure ]
+crbug.com/1039401 [ Linux ] fast/backgrounds/background-svg-scaling.html [ Failure ]
+crbug.com/1039401 [ Linux ] fast/backgrounds/size/contain-and-cover.html [ Failure ]
+crbug.com/1039401 [ Linux ] fast/dom/HTMLMeterElement/meter-boundary-values.html [ Failure ]
+crbug.com/1039401 [ Linux ] fast/dom/HTMLMeterElement/meter-optimums.html [ Failure ]
+crbug.com/1039401 [ Linux ] fast/dom/HTMLMeterElement/meter-styles.html [ Failure ]
+crbug.com/1039401 [ Linux ] fast/forms/select/input-select-after-resize.html [ Failure ]
+crbug.com/1039401 [ Linux ] paint/invalidation/forms/range-focus-by-mouse-then-keydown.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/W3C-SVG-1.1/filters-turb-01-f.svg [ Failure ]
+crbug.com/1039401 [ Linux ] svg/as-background-image/background-image-preserveaspectRatio-support.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/as-image/image-respects-deviceScaleFactor.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/zoom/page/zoom-background-image-tiled.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/zoom/page/zoom-background-images.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/zoom/page/zoom-svg-as-background-with-relative-size.html [ Failure ]
+crbug.com/1039401 [ Linux ] svg/zoom/page/zoom-svg-as-relative-image.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/date/date-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/datetimelocal/datetimelocal-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/meter/meter-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month/month-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/text-selection-outside-control.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/week/week-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/calendar-picker/date-picker-appearance-step.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/calendar-picker/date-picker-month-appearance.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/date/date-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/datetimelocal/datetimelocal-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/meter/meter-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/month/month-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/text-selection-outside-control.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/color-scheme/week/week-appearance-basic.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/month-picker/month-picker-appearance-rtl.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/month-picker/month-picker-appearance-zoom150.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/controls-refresh/time-picker/time-picker-appearance-24-hour.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/exotic-color-space/images/color-profile-mask-image-svg.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/gpu-rasterization/images/2-comp.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/gpu-rasterization/images/color-jpeg-with-color-profile.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-gradient.https.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/scroll_customization/fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/text-antialias/drawBidiText.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/text-antialias/international/bidi-listbox-atsui.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/text-antialias/international/bidi-listbox.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/text-antialias/textIteratorNilRenderer.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/web-components-v0-disabled/fast/dom/HTMLMeterElement/meter-boundary-values.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/web-components-v0-disabled/fast/dom/HTMLMeterElement/meter-optimums.html [ Failure ]
+crbug.com/1039401 [ Linux ] virtual/web-components-v0-disabled/fast/dom/HTMLMeterElement/meter-styles.html [ Failure ]
+
+# Sheriff 2020-01-09
+crbug.com/1040270 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valid-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valid-expected.txt
index b0da383..85f81beb 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valid-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valid-expected.txt
@@ -38,7 +38,7 @@
 PASS [INPUT in NUMBER status] validity.valid must be false if validity.stepMismatch is true
 FAIL [INPUT in NUMBER status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
 PASS [INPUT in CHECKBOX status] validity.valid must be false if validity.valueMissing is true
-FAIL [INPUT in RADIO status] validity.valid must be false if validity.valueMissing is true assert_false: The validity.valid should be false. expected false got true
+PASS [INPUT in RADIO status] validity.valid must be false if validity.valueMissing is true
 PASS [INPUT in FILE status] validity.valid must be false if validity.valueMissing is true
 PASS [select]  validity.valid must be false if validity.valueMissing is true
 FAIL [textarea]  validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing-expected.txt
index b4497dd..6e95bca 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 94 tests; 48 PASS, 46 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 95 tests; 50 PASS, 45 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS [INPUT in TEXT status] The required attribute is not set
 PASS [INPUT in TEXT status] The value is not empty and required is true
 FAIL [INPUT in TEXT status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true
@@ -85,7 +85,8 @@
 PASS [INPUT in CHECKBOX status] The checked attribute is false
 PASS [INPUT in RADIO status] The required attribute is not set
 PASS [INPUT in RADIO status] The checked attribute is true
-FAIL [INPUT in RADIO status] The checked attribute is false assert_true: The validity.valueMissing should be true. expected true got false
+PASS [INPUT in RADIO status] The checked attribute is false
+PASS [INPUT in RADIO status] The checked attribute is false and the name attribute is empty
 PASS [INPUT in FILE status] The required attribute is not set
 PASS [INPUT in FILE status] The Files attribute is null
 PASS [select]  The required attribute is not set
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
index 2e1c666..3229527 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
@@ -132,7 +132,8 @@
       testData: [
         {conditions: {required: false, checked: false, name: "test4"}, expected: false, name: "[target] The required attribute is not set"},
         {conditions: {required: true, checked: true, name: "test5"}, expected: false, name: "[target] The checked attribute is true"},
-        {conditions: {required: true, checked: false, name: "test6"}, expected: true, name: "[target] The checked attribute is false"}
+        {conditions: {required: true, checked: false, name: "test6"}, expected: true, name: "[target] The checked attribute is false"},
+        {conditions: {required: true, checked: false, name: ""}, expected: false, name: "[target] The checked attribute is false and the name attribute is empty"}
       ]
     },
     {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio.html
index c37fa7ac..7dcc9a14 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio.html
@@ -174,4 +174,34 @@
     assert_true(radio71.checked, "canceled click event on radio should leave the previously-checked radio checked");
     assert_false(radio72.checked, "canceled click event on previously-unchecked radio should leave that radio unchecked");
   });
+
+  test(() => {
+    const container = document.createElement('div');
+    container.innerHTML =
+        '<input type=radio name=n1><span><input type=radio name=n1 checked></span>' +
+        '<form><input type=radio name=n1 checked></form>';
+    const radios = container.querySelectorAll('input');
+    assert_false(radios[0].checked, 'Sanity check: The first radio should be unchecked');
+    assert_true(radios[1].checked, 'Sanity check: The second radio should be checked');
+    assert_true(radios[2].checked, 'Sanity check: The third radio should be checked');
+
+    radios[0].checked = true;
+    assert_true(radios[0].checked, 'The first radio should be checked after setting checked');
+    assert_false(radios[1].checked, 'The second radio should be unchecked after setting checked');
+    assert_true(radios[2].checked, 'The third radio should be checked after setting checked');
+
+    radios[1].required = true;
+    assert_false(radios[0].validity.valueMissing, 'The first radio should be valid');
+    assert_false(radios[1].validity.valueMissing, 'The second radio should be valid');
+    assert_false(radios[2].validity.valueMissing, 'The third radio should be valid');
+
+    radios[0].remove();
+    assert_false(radios[0].validity.valueMissing, 'The first radio should be valid because of no required');
+    assert_true(radios[1].validity.valueMissing, 'The second radio should be invalid***');
+    assert_false(radios[2].validity.valueMissing, 'The third radio should be valid');
+
+    radios[0].required = true;
+    radios[0].checked = false;
+    assert_true(radios[0].validity.valueMissing, 'The first radio should be invalid because of required');
+  }, 'Radio buttons in an orphan tree should make a group');
 </script>
diff --git a/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio-expected.txt b/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio-expected.txt
index 2f3445e..3a73a2a 100644
--- a/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio-expected.txt
+++ b/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio-expected.txt
@@ -38,14 +38,6 @@
 PASS inputs[0].validity.valueMissing is false
 PASS inputs[1].validity.valueMissing is false
 PASS inputs[2].validity.valueMissing is false
-
-
-Not in a radio button group
-PASS requiredButton.validity.valueMissing is false
-PASS requiredButton.validity.valueMissing is true
-PASS button.validity.valueMissing is true
-PASS button.validity.valueMissing is false
-PASS requiredButton.validity.valueMissing is false
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio.html b/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio.html
index 328cc3af..8f60caa1 100644
--- a/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio.html
+++ b/third_party/blink/web_tests/fast/forms/radio/ValidityState-valueMissing-radio.html
@@ -64,25 +64,6 @@
 shouldBeFalse('inputs[0].validity.valueMissing');
 shouldBeFalse('inputs[1].validity.valueMissing');
 shouldBeFalse('inputs[2].validity.valueMissing');
-
-debug('');
-debug('Not in a radio button group');
-var requiredButton = document.createElement('input');
-requiredButton.type = 'radio';
-requiredButton.name = 'victim';
-requiredButton.required = true;
-shouldBeFalse('requiredButton.validity.valueMissing');
-
-parent.innerHTML = '<input name=victim type=radio required><input name=victim type=radio>';
-requiredButton = document.getElementsByName('victim')[0];
-var button = document.getElementsByName('victim')[1];
-shouldBeTrue('requiredButton.validity.valueMissing');
-shouldBeTrue('button.validity.valueMissing');
-parent.removeChild(button);
-shouldBeFalse('button.validity.valueMissing');
-parent.removeChild(requiredButton);
-shouldBeFalse('requiredButton.validity.valueMissing');
-
 </script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style-expected.txt b/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style-expected.txt
index e774892..a65c221 100644
--- a/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style-expected.txt
+++ b/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style-expected.txt
@@ -6,7 +6,7 @@
 PASS backgroundOf($("radio1")) is validColor
 PASS parent.removeChild($("radio2")); backgroundOf($("radio1")) is invalidColor
 PASS $("radio1").remove(); radio2.webkitMatchesSelector(":valid") is false
-PASS radio2.remove(); radio2.webkitMatchesSelector(":valid") is true
+PASS radio2.remove(); radio2.webkitMatchesSelector(":valid") is false
 
 
 Removing a checked radio button from a required radio button group by name attribute change:
diff --git a/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style.html b/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style.html
index aaa2ab2f..d1d8315 100644
--- a/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style.html
+++ b/third_party/blink/web_tests/fast/forms/radio/radio-live-validation-style.html
@@ -35,7 +35,7 @@
     '<input type=radio name=group1 required id=radio3>';
 var radio2 = $('radio2');
 shouldBeFalse('$("radio1").remove(); radio2.webkitMatchesSelector(":valid")');
-shouldBeTrue('radio2.remove(); radio2.webkitMatchesSelector(":valid")');
+shouldBeFalse('radio2.remove(); radio2.webkitMatchesSelector(":valid")');
 debug('');
 
 debug('Removing a checked radio button from a required radio button group by name attribute change:');
diff --git a/third_party/blink/web_tests/hid/resources/hid-test-utils.js b/third_party/blink/web_tests/hid/resources/hid-test-utils.js
index b177301e..ed12d48 100644
--- a/third_party/blink/web_tests/hid/resources/hid-test-utils.js
+++ b/third_party/blink/web_tests/hid/resources/hid-test-utils.js
@@ -159,7 +159,8 @@
   makeDevice(vendorId, productId) {
     let guidValue = ++this.nextGuidValue_;
     let info = new device.mojom.HidDeviceInfo();
-    info.guid = guidValue.toString();
+    info.guid = 'guid-' + guidValue.toString();
+    info.physicalDeviceId = 'physical-device-id-' + guidValue.toString();
     info.vendorId = vendorId;
     info.productId = productId;
     info.productName = 'product name';
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/document-markers-zoom-150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/document-markers-zoom-150-expected.png
index 59f75f2..3a72804 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/document-markers-zoom-150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/document-markers-zoom-150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-125-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-125-expected.png
index 42b11b3..ff7e010 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-125-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-150-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-150-expected.png
index bd771639..e5bd916 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-175-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-175-expected.png
index 0133e0a..68fb1c1 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-175-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-175-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-250-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-250-expected.png
index 9fc127d1..9a637ed 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-250-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/document-markers-zoom-250-expected.png
Binary files differ
diff --git a/third_party/cacheinvalidation/OWNERS b/third_party/cacheinvalidation/OWNERS
index cc3ad17..b0bb3a0 100644
--- a/third_party/cacheinvalidation/OWNERS
+++ b/third_party/cacheinvalidation/OWNERS
@@ -5,6 +5,5 @@
 
 dcheng@chromium.org
 nyquist@chromium.org
-zea@chromium.org
 
 # COMPONENT: Services>Invalidation
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium
index 3b63f55..c1d2ba54 100644
--- a/third_party/inspector_protocol/README.chromium
+++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@
 Short Name: inspector_protocol
 URL: https://chromium.googlesource.com/deps/inspector_protocol/
 Version: 0
-Revision: b29d8a5d2bb56b3e555bb27a0e035a9d571c5f28
+Revision: dee0c0c65cc2df6284e75ae9fca083dc604c9fca
 License: BSD
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/inspector_protocol/templates/Exported_h.template b/third_party/inspector_protocol/templates/Exported_h.template
index 4e779ba6..d59ae7bf 100644
--- a/third_party/inspector_protocol/templates/Exported_h.template
+++ b/third_party/inspector_protocol/templates/Exported_h.template
@@ -66,7 +66,6 @@
 
 class {{config.exported.export_macro}} {{type.id}} : public Exported {
 public:
-    static std::unique_ptr<protocol::{{domain.domain}}::API::{{type.id}}> fromJSONString(const {{config.exported.string_in}}& json);
     static std::unique_ptr<protocol::{{domain.domain}}::API::{{type.id}}> fromBinary(const uint8_t* data, size_t length);
 };
   {% endfor %}
diff --git a/third_party/inspector_protocol/templates/TypeBuilder_cpp.template b/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
index a39328c3..315cafd5 100644
--- a/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
+++ b/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
@@ -126,16 +126,6 @@
 }
 
 // static
-std::unique_ptr<API::{{type.id}}> API::{{type.id}}::fromJSONString(const {{config.exported.string_in}}& json)
-{
-    ErrorSupport errors;
-    std::unique_ptr<Value> value = StringUtil::parseJSON(json);
-    if (!value)
-        return nullptr;
-    return protocol::{{domain.domain}}::{{type.id}}::fromValue(value.get(), &errors);
-}
-
-// static
 std::unique_ptr<API::{{type.id}}> API::{{type.id}}::fromBinary(const uint8_t* data, size_t length)
 {
     ErrorSupport errors;
diff --git a/tools/json_to_struct/element_generator.py b/tools/json_to_struct/element_generator.py
index e347532..24f7583 100644
--- a/tools/json_to_struct/element_generator.py
+++ b/tools/json_to_struct/element_generator.py
@@ -111,7 +111,7 @@
   if content is None:
     content = field_info.get('default', None)
   type = field_info['type']
-  if type == 'int' or type == 'enum':
+  if type in ('int', 'enum', 'class'):
     lines.append('%s%s,' % (indent, content))
   elif type == 'string':
     _GenerateString(content, lines, indent)
diff --git a/tools/json_to_struct/element_generator_test.py b/tools/json_to_struct/element_generator_test.py
index 373338e..08592f4d4 100755
--- a/tools/json_to_struct/element_generator_test.py
+++ b/tools/json_to_struct/element_generator_test.py
@@ -67,6 +67,19 @@
     GenerateFieldContent('', {'type': 'enum'}, 'BLUE', lines, '  ', {})
     self.assertEquals(['  BLUE,'], lines)
 
+  def testGenerateClassFieldContent(self):
+    lines = []
+    GenerateFieldContent('', {'type': 'class', 'default': 'base::nullopt'},
+                         None, lines, '  ', {})
+    self.assertEquals(['  base::nullopt,'], lines)
+    lines = []
+    GenerateFieldContent('', {'type': 'class', 'default': 'base::nullopt'},
+                         'true', lines, '  ', {})
+    self.assertEquals(['  true,'], lines)
+    lines = []
+    GenerateFieldContent('', {'type': 'class'}, 'false', lines, '  ', {})
+    self.assertEquals(['  false,'], lines)
+
   def testGenerateArrayFieldContent(self):
     lines = ['STRUCT BEGINS'];
     GenerateFieldContent('test', {'type': 'array', 'contents': {'type': 'int'}},
diff --git a/tools/json_to_struct/struct_generator.py b/tools/json_to_struct/struct_generator.py
index 5849d82..f486bd5 100644
--- a/tools/json_to_struct/struct_generator.py
+++ b/tools/json_to_struct/struct_generator.py
@@ -24,7 +24,7 @@
     return 'const char* const %s' % field
   elif type == 'string16':
     return 'const wchar_t* const %s' % field
-  elif type == 'enum':
+  elif type == 'enum' or type == 'class':
     return 'const %s %s' % (field_info['ctype'], field)
   elif type == 'array':
     return _GenerateArrayField(field_info)
diff --git a/tools/json_to_struct/struct_generator_test.py b/tools/json_to_struct/struct_generator_test.py
index bff5db73..485a93e0 100755
--- a/tools/json_to_struct/struct_generator_test.py
+++ b/tools/json_to_struct/struct_generator_test.py
@@ -33,6 +33,12 @@
                        'field': 'bar_bar',
                        'contents': {'type': 'int'}}))
 
+  def testGenerateClassField(self):
+    self.assertEquals('const base::Optional<bool> bar',
+        GenerateField({'type': 'class',
+                       'field': 'bar',
+                       'ctype': 'base::Optional<bool>'}))
+
   def testGenerateStruct(self):
     schema = [
       {'type': 'int', 'field': 'foo_bar'},
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 4e1a99c..a667987 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -20902,7 +20902,25 @@
   <description>Please enter the description of the metric.</description>
 </action>
 
+<action name="StartSurface.Hidden">
+  <owner>gogerald@chromium.org</owner>
+  <description>
+    Metric record when the StartSurface overview is hidden.
+  </description>
+</action>
+
+<action name="StartSurface.Shown">
+  <owner>gogerald@chromium.org</owner>
+  <description>
+    Metric record when the StartSurface overview is shown.
+  </description>
+</action>
+
 <action name="StartSurface.SinglePane">
+  <obsolete>
+    Split in StartSurface.SinglePane.Home and
+    StartSurface.SinglePane.Tabswitcher.
+  </obsolete>
   <owner>gogerald@chromium.org</owner>
   <description>
     Metric record when the single pane start surface is shown (the user taps the
@@ -20910,6 +20928,14 @@
   </description>
 </action>
 
+<action name="StartSurface.SinglePane.Home">
+  <owner>gogerald@chromium.org</owner>
+  <description>
+    Metric record when the single pane home surface is shown (the user taps the
+    home button or on chrome start).
+  </description>
+</action>
+
 <action name="StartSurface.SinglePane.MoreTabs">
   <owner>gogerald@chromium.org</owner>
   <description>
@@ -20918,6 +20944,14 @@
   </description>
 </action>
 
+<action name="StartSurface.SinglePane.Tabswitcher">
+  <owner>gogerald@chromium.org</owner>
+  <description>
+    Metric record when the single pane tabswitcher surface is shown (the user
+    taps the tabswitcher button or more tabs button).
+  </description>
+</action>
+
 <action name="StartSurface.TasksOnly">
   <owner>gogerald@chromium.org</owner>
   <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 5c91d52..9fe5413 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -19107,6 +19107,7 @@
   <int value="655" label="PrimaryMouseButtonSwitch"/>
   <int value="656" label="ReportDeviceCpuInfo"/>
   <int value="657" label="DeviceLoginScreenPrimaryMouseButtonSwitch"/>
+  <int value="658" label="PerAppTimeLimitsWhitelist"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -36418,6 +36419,7 @@
   <int value="-1872989945" label="enable-webview-based-signin"/>
   <int value="-1872867546" label="EnumerateAudioDevices:disabled"/>
   <int value="-1872205507" label="ShelfNewUi:enabled"/>
+  <int value="-1871552967" label="DesktopPWAsTabStrip:disabled"/>
   <int value="-1871185948" label="VrLaunchIntents:disabled"/>
   <int value="-1870961970" label="enable-filemanager-mtp"/>
   <int value="-1869845022" label="force-show-update-menu-item"/>
@@ -37794,6 +37796,7 @@
   <int value="-141516902" label="UseModernMediaControls:enabled"/>
   <int value="-140168253" label="ProfileMenuRevamp:enabled"/>
   <int value="-138983372" label="DesktopPWAWindowing:disabled"/>
+  <int value="-138820512" label="DesktopPWAsTabStrip:enabled"/>
   <int value="-138773929" label="PassiveDocumentEventListeners:enabled"/>
   <int value="-138760381" label="AutofillManualFallbackAndroid:enabled"/>
   <int value="-137303226" label="enable-chromevox-developer-option"/>
@@ -66853,6 +66856,7 @@
   <int value="-1382906531" label="chrome://managed-user-passphrase/"/>
   <int value="-1379571130" label="chrome://newtab/"/>
   <int value="-1378421581" label="chrome://media-router/"/>
+  <int value="-1331415629" label="chrome://os-settings/"/>
   <int value="-1313432739" label="chrome://plugins/"/>
   <int value="-1239015343" label="chrome://kill/"/>
   <int value="-1224398205" label="chrome://prefs-internals/"/>
@@ -66953,6 +66957,7 @@
   <int value="1281801197" label="chrome://terms/"/>
   <int value="1286620182" label="chrome://reset-password/"/>
   <int value="1306215264" label="chrome://activationmessage/"/>
+  <int value="1326111536" label="chrome://new-tab-page/"/>
   <int value="1340926535" label="chrome://network/"/>
   <int value="1354146226" label="chrome://tab-modal-confirm-dialog/"/>
   <int value="1371905827" label="chrome://flags/"/>
@@ -66966,6 +66971,7 @@
   <int value="1466599095" label="chrome://oobe/"/>
   <int value="1467342679" label="chrome://memory-internals/"/>
   <int value="1476643520" label="chrome://internet-detail-dialog/"/>
+  <int value="1506419762" label="devtools://devtools/"/>
   <int value="1540230808" label="chrome://power/"/>
   <int value="1554928128" label="chrome://sync-confirmation/?consent-bump"/>
   <int value="1568301017" label="chrome://media-internals/"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index e2019a1..3e80e62d 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -5778,8 +5778,10 @@
   </summary>
 </histogram>
 
-<histogram name="Apps.AppListPageOpened" enum="AppListPage" expires_after="M81">
+<histogram name="Apps.AppListPageOpened" enum="AppListPage"
+    expires_after="2021-02-01">
   <owner>calamity@chromium.org</owner>
+  <owner>src/ash/app_list/OWNERS</owner>
   <summary>
     The page that the app list goes to. This is gathered every time the user
     initiates a transition to another page in the launcher.
@@ -24258,9 +24260,11 @@
 
 <histogram
     name="Compositing.Renderer.PercentPictureLayersWithTextButLCDTextDisabled"
-    units="%" expires_after="2020-02-01">
+    units="%" expires_after="2020-05-01">
 <!-- Name completed by histogram_suffixes name="CompositingLCDTextDisabledCountSuffixes" -->
 
+  <owner>pdr@chromium.org</owner>
+  <owner>samfort@microsoft.com</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of PictureLayers in the active tree for each compositor frame
@@ -25313,8 +25317,9 @@
 </histogram>
 
 <histogram name="ContentSettings.ImagePressed" enum="ContentSettingImageType"
-    expires_after="M81">
+    expires_after="2021-02-01">
   <owner>calamity@chromium.org</owner>
+  <owner>src/chrome/browser/ui/page_action/OWNERS</owner>
   <summary>
     Counts which content setting buttons are pressed by the user.
   </summary>
@@ -58747,8 +58752,9 @@
 </histogram>
 
 <histogram name="HostedAppFrame.ContentSettings.ImagePressed"
-    enum="ContentSettingImageType" expires_after="M81">
+    enum="ContentSettingImageType" expires_after="2021-02-01">
   <owner>calamity@chromium.org</owner>
+  <owner>src/chrome/browser/ui/page_action/OWNERS</owner>
   <summary>
     Counts which content setting buttons in the hosted app frame are pressed by
     the user.
@@ -72418,7 +72424,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Gpu2.Small" units="KB"
-    expires_after="2019-12-31">
+    expires_after="2020-12-31">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -73102,7 +73108,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Utility2" units="MB"
-    expires_after="2019-12-31">
+    expires_after="2020-12-31">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -73114,7 +73120,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Utility2.Small" units="KB"
-    expires_after="2019-12-31">
+    expires_after="2020-12-31">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -73126,7 +73132,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Utility2.Tiny" units="bytes"
-    expires_after="2019-12-31">
+    expires_after="2020-12-31">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -121803,14 +121809,14 @@
 </histogram>
 
 <histogram name="ProtoDB.DestroySuccess" enum="BooleanSuccess"
-    expires_after="M81">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB Destroy call was successful or not.</summary>
 </histogram>
 
 <histogram name="ProtoDB.GetErrorStatus" enum="LevelDBStatus"
-    expires_after="M81">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -121818,13 +121824,13 @@
   </summary>
 </histogram>
 
-<histogram name="ProtoDB.GetFound" enum="Boolean" expires_after="M81">
+<histogram name="ProtoDB.GetFound" enum="Boolean" expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB Get call found what was requested.</summary>
 </histogram>
 
-<histogram name="ProtoDB.GetSuccess" enum="BooleanSuccess" expires_after="M81">
+<histogram name="ProtoDB.GetSuccess" enum="BooleanSuccess" expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB Get call was successful or not.</summary>
@@ -121838,14 +121844,14 @@
 </histogram>
 
 <histogram name="ProtoDB.LoadEntriesSuccess" enum="BooleanSuccess"
-    expires_after="M81">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB LoadEntries call was successful or not.</summary>
 </histogram>
 
 <histogram name="ProtoDB.LoadKeysAndEntriesSuccess" enum="BooleanSuccess"
-    expires_after="M81">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -121854,7 +121860,7 @@
 </histogram>
 
 <histogram name="ProtoDB.LoadKeysSuccess" enum="BooleanSuccess"
-    expires_after="2020-04-05">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB LoadKeys call was successful or not.</summary>
@@ -121875,7 +121881,7 @@
 </histogram>
 
 <histogram name="ProtoDB.UpdateErrorStatus" enum="LevelDBStatus"
-    expires_after="M81">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -121884,7 +121890,7 @@
 </histogram>
 
 <histogram name="ProtoDB.UpdateSuccess" enum="BooleanSuccess"
-    expires_after="M81">
+    expires_after="M83">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB UpdateEntries call was successful or not.</summary>
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py
index 5078ca1..51557ad 100644
--- a/tools/perf/page_sets/system_health/browsing_stories.py
+++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -1412,7 +1412,7 @@
     '''
   SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
   TAGS = [story_tags.JAVASCRIPT_HEAVY, story_tags.WEBGL,
-          story_tags.YEAR_2018]
+          story_tags.YEAR_2019]
 
   def _DidLoadDocument(self, action_runner):
     # Click on the search box.
diff --git a/tools/perf/system_health_stories.csv b/tools/perf/system_health_stories.csv
index 8d2f496..aced981 100644
--- a/tools/perf/system_health_stories.csv
+++ b/tools/perf/system_health_stories.csv
@@ -75,7 +75,7 @@
 browse:tech:discourse_infinite_scroll:2018,,"desktop,mobile","2018,infinite_scroll"
 browse:tools:earth,Google Earth story:,desktop,"2016,javascript_heavy,webgl"
 browse:tools:maps,Google maps story:,"desktop,mobile","2016,emerging_market,javascript_heavy,webgl"
-browse:tools:maps:2019,Google maps story:,"desktop,mobile","2018,2019,emerging_market,javascript_heavy,webgl"
+browse:tools:maps:2019,Google maps story:,"desktop,mobile","2019,emerging_market,javascript_heavy,webgl"
 browse:tools:sheets:2019,,desktop,"2019,javascript_heavy"
 browse_accessibility:media:youtube,Tests interacting with the YouTube home page.,desktop,"2016,accessibility,keyboard_input"
 browse_accessibility:tech:codesearch:2018,Tests scrolling an element within a page.,desktop,"2018,accessibility,scroll"
diff --git a/tools/variations/fieldtrial_to_struct.py b/tools/variations/fieldtrial_to_struct.py
index b1d92de..1a440c2 100755
--- a/tools/variations/fieldtrial_to_struct.py
+++ b/tools/variations/fieldtrial_to_struct.py
@@ -58,8 +58,7 @@
   return 'Study::' + form_factor.upper()
 
 def _Load(filename):
-  """Loads a JSON file into a Python object and return this object.
-  """
+  """Loads a JSON file into a Python object and return this object."""
   with open(filename, 'r') as handle:
     result = json.loads(json_comment_eater.Nom(handle.read()))
   return result
@@ -82,14 +81,29 @@
 
 def _CreateExperiment(experiment_data,
                       platforms,
-                      is_low_end_device,
-                      form_factors):
+                      form_factors,
+                      is_low_end_device):
+  """Creates an experiment dictionary with all necessary information.
+
+  Args:
+    experiment_data: An experiment json config.
+    platforms: A list of platforms for this trial. This should be
+      a subset of |_platforms|.
+    form_factors: A list of form factors for this trial. This should be
+      a subset of |_form_factors|.
+    is_low_end_device: An optional parameter. This can either be True or
+      False. None if not specified.
+
+  Returns:
+    An experiment dict.
+  """
   experiment = {
     'name': experiment_data['name'],
     'platforms': [_PlatformEnumValue(p) for p in platforms],
-    'is_low_end_device': is_low_end_device,
     'form_factors': [_FormFactorEnumValue(f) for f in form_factors],
   }
+  if is_low_end_device is not None:
+    experiment['is_low_end_device'] = str(is_low_end_device).lower()
   forcing_flags_data = experiment_data.get('forcing_flag')
   if forcing_flags_data:
     experiment['forcing_flag'] = forcing_flags_data
@@ -110,26 +124,22 @@
   return experiment
 
 def _CreateTrial(study_name, experiment_configs, platforms):
-  """Returns the applicable experiments for |study_name| and |platforms|. This
-  iterates through all of the experiment_configs for |study_name| and picks out
-  the applicable experiments based off of the valid platforms and device
-  type settings if specified.
+  """Returns the applicable experiments for |study_name| and |platforms|.
+
+  This iterates through all of the experiment_configs for |study_name|
+  and picks out the applicable experiments based off of the valid platforms
+  and device type settings if specified.
   """
   experiments = []
   for config in experiment_configs:
     platform_intersection = [p for p in platforms if p in config['platforms']]
-    is_low_end_device = 'Study::OPTIONAL_BOOL_MISSING'
-    if 'is_low_end_device' in config:
-      is_low_end_device = ('Study::OPTIONAL_BOOL_TRUE'
-                           if config['is_low_end_device']
-                           else 'Study::OPTIONAL_BOOL_FALSE')
 
     if platform_intersection:
       experiments += [_CreateExperiment(
                           e,
                           platform_intersection,
-                          is_low_end_device,
-                          config.get('form_factors', []))
+                          config.get('form_factors', []),
+                          config.get('is_low_end_device'))
                       for e in config['experiments']]
   return {
     'name': study_name,
diff --git a/tools/variations/fieldtrial_to_struct_unittest.py b/tools/variations/fieldtrial_to_struct_unittest.py
index 57c090f..a758682 100644
--- a/tools/variations/fieldtrial_to_struct_unittest.py
+++ b/tools/variations/fieldtrial_to_struct_unittest.py
@@ -80,7 +80,6 @@
                   ],
                   'enable_features': ['A', 'B'],
                   'disable_features': ['C'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 },
                 {
@@ -92,7 +91,6 @@
                   ],
                   'enable_features': ['D', 'E'],
                   'disable_features': ['F'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 },
               ],
@@ -103,7 +101,6 @@
                 {
                   'name': 'OtherGroup',
                   'platforms': ['Study::PLATFORM_WINDOWS'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 }
               ]
@@ -115,7 +112,6 @@
                     'name': 'ForcedGroup',
                     'platforms': ['Study::PLATFORM_WINDOWS'],
                     'forcing_flag': "my-forcing-flag",
-                    'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                     'form_factors': [],
                   }
               ]
@@ -131,7 +127,7 @@
     'Trial1': [
       {
         'platforms': ['windows', 'ios'],
-        'is_low_end_device': True,
+        'is_low_end_device': 'true',
         'experiments': [
           {
             'name': 'Group1',
@@ -189,7 +185,7 @@
                   ],
                   'enable_features': ['A', 'B'],
                   'disable_features': ['C'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_TRUE',
+                  'is_low_end_device': 'true',
                   'form_factors': [],
                 },
                 {
@@ -201,13 +197,12 @@
                   ],
                   'enable_features': ['D', 'E'],
                   'disable_features': ['F'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_TRUE',
+                  'is_low_end_device': 'true',
                   'form_factors': [],
                 },
                 {
                   'name': 'IOSOnly',
                   'platforms': ['Study::PLATFORM_IOS'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 },
               ],
@@ -232,7 +227,6 @@
                 {
                   'name': 'OtherGroup',
                   'platforms': ['Study::PLATFORM_MAC'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 },
               ],
@@ -274,7 +268,6 @@
                 {
                   'name': 'Group1',
                   'platforms': ['Study::PLATFORM_WINDOWS'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': ['Study::DESKTOP', 'Study::PHONE'],
                 },
               ],
@@ -285,7 +278,6 @@
                 {
                   'name': 'OtherGroup',
                   'platforms': ['Study::PLATFORM_WINDOWS'],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': ['Study::TABLET'],
                 },
               ],
@@ -352,7 +344,6 @@
                       'value': 'test2'
                     },
                   ],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 },
               ],
@@ -370,7 +361,6 @@
                       'value': 'test3'
                     },
                   ],
-                  'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
                   'form_factors': [],
                 },
               ],
diff --git a/tools/variations/unittest_data/DEPS b/tools/variations/unittest_data/DEPS
index e6d615a..75aaaa7d 100644
--- a/tools/variations/unittest_data/DEPS
+++ b/tools/variations/unittest_data/DEPS
@@ -1,3 +1,6 @@
 specific_include_rules = {
-  "expected_output.h": ["+components/variations/proto/study.pb.h"]
+  "expected_output.h": [
+      "+base/optional.h",
+      "+components/variations/proto/study.pb.h"
+  ]
 }
diff --git a/tools/variations/unittest_data/expected_output.cc b/tools/variations/unittest_data/expected_output.cc
index 54ca24e..1bc1765 100644
--- a/tools/variations/unittest_data/expected_output.cc
+++ b/tools/variations/unittest_data/expected_output.cc
@@ -28,7 +28,7 @@
       1,
       array_kFieldTrialConfig_form_factors_8,
       0,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       NULL,
       0,
       NULL,
@@ -60,7 +60,7 @@
       1,
       array_kFieldTrialConfig_form_factors_6,
       2,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       NULL,
       0,
       NULL,
@@ -77,7 +77,7 @@
       1,
       array_kFieldTrialConfig_form_factors_7,
       1,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       NULL,
       0,
       NULL,
@@ -101,7 +101,7 @@
       1,
       array_kFieldTrialConfig_form_factors_5,
       0,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       NULL,
       0,
       NULL,
@@ -130,7 +130,7 @@
       1,
       array_kFieldTrialConfig_form_factors_3,
       0,
-      Study::OPTIONAL_BOOL_TRUE,
+      true,
       NULL,
       0,
       NULL,
@@ -147,7 +147,7 @@
       1,
       array_kFieldTrialConfig_form_factors_4,
       0,
-      Study::OPTIONAL_BOOL_FALSE,
+      false,
       NULL,
       0,
       NULL,
@@ -174,7 +174,7 @@
       1,
       array_kFieldTrialConfig_form_factors_2,
       0,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       NULL,
       0,
       array_kFieldTrialConfig_enable_features_1,
@@ -237,7 +237,7 @@
       1,
       array_kFieldTrialConfig_form_factors_0,
       0,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       array_kFieldTrialConfig_params,
       2,
       array_kFieldTrialConfig_enable_features,
@@ -254,7 +254,7 @@
       1,
       array_kFieldTrialConfig_form_factors_1,
       0,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       array_kFieldTrialConfig_params_0,
       2,
       array_kFieldTrialConfig_enable_features_0,
@@ -278,7 +278,7 @@
       1,
       array_kFieldTrialConfig_form_factors,
       0,
-      Study::OPTIONAL_BOOL_MISSING,
+      base::nullopt,
       NULL,
       0,
       NULL,
diff --git a/tools/variations/unittest_data/expected_output.h b/tools/variations/unittest_data/expected_output.h
index 891823f..7612fb3 100644
--- a/tools/variations/unittest_data/expected_output.h
+++ b/tools/variations/unittest_data/expected_output.h
@@ -12,6 +12,7 @@
 
 #include <cstddef>
 
+#include "base/optional.h"
 #include "components/variations/proto/study.pb.h"
 
 struct OverrideUIString {
@@ -30,7 +31,7 @@
   const size_t platforms_size;
   const Study::FormFactor * form_factors;
   const size_t form_factors_size;
-  const Study::OptionalBool is_low_end_device;
+  const base::Optional<bool> is_low_end_device;
   const FieldTrialTestingExperimentParams * params;
   const size_t params_size;
   const char* const * enable_features;
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index 1f4051e..d5fa981b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -80,7 +80,7 @@
 <translation id="1847880352285315359">تم الحفظ</translation>
 <translation id="1864756863218646478">تعذر العثور على الملف.</translation>
 <translation id="1921986354447415460">‏لوحة مفاتيح Turkish-F</translation>
-<translation id="1924372192547904021">تم تهيئة<ph name="DRIVE_NAME" /></translation>
+<translation id="1924372192547904021">تم ضبط <ph name="DRIVE_NAME" /></translation>
 <translation id="1931134289871235022">السلوفاكية</translation>
 <translation id="1933345018156373194">تعذَّر النقل، خطأ غير متوقِّع: <ph name="ERROR_MESSAGE" /></translation>
 <translation id="1936717151811561466">الفنلندية</translation>
@@ -164,7 +164,7 @@
 <translation id="2942290791863759244">‏لوحة المفاتيح الألمانية Neo 2</translation>
 <translation id="2943400156390503548">الشرائح</translation>
 <translation id="2943503720238418293">استخدم اسم أقصر</translation>
-<translation id="2949781154072577687">جارٍ تهيئة<ph name="DRIVE_NAME" />...</translation>
+<translation id="2949781154072577687">جارٍ ضبط <ph name="DRIVE_NAME" />...</translation>
 <translation id="2951236788251446349">قنديل البحر</translation>
 <translation id="2963783323012015985">لوحة المفاتيح التركية</translation>
 <translation id="2966459079597787514">لوحة المفاتيح السويدية</translation>
@@ -392,7 +392,7 @@
 <translation id="5464696796438641524">لوحة المفاتيح البولندية</translation>
 <translation id="5465122519792752163">‏لوحة مفاتيح اللغة النيبالية (InScript)</translation>
 <translation id="5469868506864199649">الإيطالية</translation>
-<translation id="5494920125229734069">تحديد الكل</translation>
+<translation id="5494920125229734069">اختيار الكل</translation>
 <translation id="5500122897333236901">الأيسلندية</translation>
 <translation id="5508696409934741614">نقاط</translation>
 <translation id="5522908512596376669">تم تغيير قائمة الملفات إلى عرض القائمة.</translation>
@@ -571,7 +571,7 @@
 <translation id="7649070708921625228">مساعدة</translation>
 <translation id="7654209398114106148">جارٍ نقل <ph name="NUMBER_OF_ITEMS" /> من العناصر...</translation>
 <translation id="7658239707568436148">إلغاء</translation>
-<translation id="7695430100978772476">تعذّر تهيئة<ph name="DRIVE_NAME" /></translation>
+<translation id="7695430100978772476">تعذّر ضبط <ph name="DRIVE_NAME" /></translation>
 <translation id="770015031906360009">اليونانية</translation>
 <translation id="7706319470528945664">لوحة المفاتيح البرتغالية</translation>
 <translation id="7711920809702896782">معلومات الصورة</translation>
@@ -594,7 +594,7 @@
 <translation id="7825423931463735974">‏لوحة المفاتيح التاميلية (Tamil99)</translation>
 <translation id="7827012282502221009"><ph name="NUMBER_OF_TB" /> تيرابايت</translation>
 <translation id="7839804798877833423">سيؤدي جلب هذه الملفات إلى استخدام حوالي <ph name="FILE_SIZE" /> من بيانات الجوال.</translation>
-<translation id="7846076177841592234">إلغاء التحديد</translation>
+<translation id="7846076177841592234">إلغاء الاختيار</translation>
 <translation id="7853966320808728790">‏BÉPO الفرنسية</translation>
 <translation id="7864662577698025113">إضافة خدمة جديدة</translation>
 <translation id="7873831373602885875">يتعذَّر الحفظ في <ph name="FOLDER_NAME" />. وسيتم حفظ جميع التعديلات في <ph name="DOWNLOADS_FOLDER" /> في مجلَّد "التنزيلات".</translation>
@@ -677,7 +677,7 @@
 <translation id="8722421161699219904">لوحة المفاتيح الأمريكية الدولية</translation>
 <translation id="872537912056138402">الكرواتية</translation>
 <translation id="874420130893181774">‏أسلوب إدخال Pinyin التقليدي</translation>
-<translation id="8775404590947523323">يتم حفظ التعديلات تلقائيًا.<ph name="BREAKS" />للاحتفاظ بنسخة من الصورة الأصلية، يجب إلغاء تحديد "استبدال الملف الأصلي"</translation>
+<translation id="8775404590947523323">يتم حفظ التعديلات تلقائيًا.<ph name="BREAKS" />للاحتفاظ بنسخة من الصورة الأصلية، يجب إلغاء اختيار "استبدال الملف الأصلي"</translation>
 <translation id="8803496343472038847">لوحة المفاتيح الصوتية الروسية</translation>
 <translation id="8808686172382650546">قط</translation>
 <translation id="8810671769985673465">تعذّر الضغط، العناصر الموجودة هي: "<ph name="FILE_NAME" />"</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
index d3e5c8c..a2078cb 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -80,7 +80,7 @@
 <translation id="1847880352285315359">সেভ করা হয়েছে</translation>
 <translation id="1864756863218646478">ফাইলটি পাওয়া যায়নি৷</translation>
 <translation id="1921986354447415460">তুর্কি-এফ কীবোর্ড</translation>
-<translation id="1924372192547904021"><ph name="DRIVE_NAME" /> ফর্ম্যাট করা হয়েছে</translation>
+<translation id="1924372192547904021"><ph name="DRIVE_NAME" /> ফরম্যাট করা হয়েছে</translation>
 <translation id="1931134289871235022">স্লোভাক</translation>
 <translation id="1933345018156373194">স্থানান্তরিত করা যায়নি, অপ্রত্যাশিত সমস্যা হয়েছে: <ph name="ERROR_MESSAGE" /></translation>
 <translation id="1936717151811561466">ফিনিশ</translation>
@@ -164,7 +164,7 @@
 <translation id="2942290791863759244">জার্মান NEO 2 কীবোর্ড</translation>
 <translation id="2943400156390503548">স্লাইড</translation>
 <translation id="2943503720238418293">অন্য একটি ছোট নাম ব্যবহার করুন</translation>
-<translation id="2949781154072577687"><ph name="DRIVE_NAME" /> ফর্ম্যাট করা হচ্ছে...</translation>
+<translation id="2949781154072577687"><ph name="DRIVE_NAME" /> ফরম্যাট করা হচ্ছে...</translation>
 <translation id="2951236788251446349">জেলিফিশ</translation>
 <translation id="2963783323012015985">তুর্কী কীবোর্ড</translation>
 <translation id="2966459079597787514">সুইডিশ কীবোর্ড</translation>
@@ -570,7 +570,7 @@
 <translation id="7649070708921625228">সহায়তা</translation>
 <translation id="7654209398114106148"><ph name="NUMBER_OF_ITEMS" />টি আইটেম স্থানান্তরিত করা হচ্ছে…</translation>
 <translation id="7658239707568436148">বাতিল</translation>
-<translation id="7695430100978772476"><ph name="DRIVE_NAME" /> ফর্ম্যাট করা যায়নি</translation>
+<translation id="7695430100978772476"><ph name="DRIVE_NAME" /> ফরম্যাট করা যায়নি</translation>
 <translation id="770015031906360009">গ্রীক</translation>
 <translation id="7706319470528945664">পর্তুগিজ কীবোর্ড</translation>
 <translation id="7711920809702896782">ইমেজর তথ্য</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
index 4ee5ab0..557738d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -448,7 +448,7 @@
 <translation id="6074825444536523002">Formulario de Google</translation>
 <translation id="6096979789310008754">Busca texto borrado, con todos los archivos y carpetas.</translation>
 <translation id="6111770213269631447">Transliteración (namaskar → নমস্কার)</translation>
-<translation id="6129953537138746214">Google Space</translation>
+<translation id="6129953537138746214">Espacio</translation>
 <translation id="6133173853026656527">Moviendo <ph name="FILE_NAME" />…</translation>
 <translation id="6146563240635539929">Videos</translation>
 <translation id="6150853954427645995">Para guardar este archivo para su uso sin conexión, conéctate nuevamente, haz clic con el botón secundario en el archivo y selecciona la opción <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
index 1614654..1787cde 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -357,7 +357,7 @@
        A remoção do dispositivo enquanto ele está em uso pode causar perda de dados. Espere até que a operação esteja terminada e remova o dispositivo usando o aplicativo Arquivos.</translation>
 <translation id="5163869187418756376">Falha no compartilhamento. Verifique sua conexão e tente novamente mais tarde.</translation>
 <translation id="516592729076796170">Programmer Dvorak americano</translation>
-<translation id="5167131699331641907">Teclado da Holanda</translation>
+<translation id="5167131699331641907">Teclado da Países Baixos</translation>
 <translation id="5170477580121653719">Espaço restante no Google Drive: <ph name="SPACE_AVAILABLE" />.</translation>
 <translation id="5177526793333269655">Visualização em miniatura</translation>
 <translation id="5194713942430106590">Clique para classificar a coluna em ordem crescente.</translation>
diff --git a/ui/file_manager/image_loader/cache.js b/ui/file_manager/image_loader/cache.js
index e7a5c01..04f34c3 100644
--- a/ui/file_manager/image_loader/cache.js
+++ b/ui/file_manager/image_loader/cache.js
@@ -54,8 +54,8 @@
   // Establish a connection to the database or (re)create it if not available
   // or not up to date. After changing the database's schema, increment
   // ImageCache.DB_VERSION to force database recreating.
-  var openRequest = window.indexedDB.open(
-      ImageCache.DB_NAME, ImageCache.DB_VERSION);
+  const openRequest =
+      window.indexedDB.open(ImageCache.DB_NAME, ImageCache.DB_VERSION);
 
   openRequest.onsuccess = function(e) {
     this.db_ = e.target.result;
@@ -66,7 +66,7 @@
 
   openRequest.onupgradeneeded = function(e) {
     console.info('Cache database creating or upgrading.');
-    var db = e.target.result;
+    const db = e.target.result;
     if (db.objectStoreNames.contains('metadata')) {
       db.deleteObjectStore('metadata');
     }
@@ -91,9 +91,9 @@
  * @private
  */
 ImageCache.prototype.setCacheSize_ = function(size, opt_transaction) {
-  var transaction = opt_transaction ||
-      this.db_.transaction(['settings'], 'readwrite');
-  var settingsStore = transaction.objectStore('settings');
+  const transaction =
+      opt_transaction || this.db_.transaction(['settings'], 'readwrite');
+  const settingsStore = transaction.objectStore('settings');
 
   settingsStore.put({key: 'size', value: size});  // Update asynchronously.
 };
@@ -109,10 +109,10 @@
  */
 ImageCache.prototype.fetchCacheSize_ = function(
     onSuccess, onFailure, opt_transaction) {
-  var transaction = opt_transaction ||
+  const transaction = opt_transaction ||
       this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
-  var settingsStore = transaction.objectStore('settings');
-  var sizeRequest = settingsStore.get('size');
+  const settingsStore = transaction.objectStore('settings');
+  const sizeRequest = settingsStore.get('size');
 
   sizeRequest.onsuccess = function(e) {
     if (e.target.result) {
@@ -141,7 +141,7 @@
  */
 ImageCache.prototype.evictCache_ = function(
     size, onSuccess, onFailure, opt_transaction) {
-  var transaction = opt_transaction ||
+  const transaction = opt_transaction ||
       this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
 
   // Check if the requested size is smaller than the cache size.
@@ -150,7 +150,7 @@
     return;
   }
 
-  var onCacheSize = function(cacheSize) {
+  const onCacheSize = function(cacheSize) {
     if (size < ImageCache.MEMORY_LIMIT - cacheSize) {
       // Enough space, no need to evict.
       this.setCacheSize_(cacheSize + size, transaction);
@@ -158,21 +158,21 @@
       return;
     }
 
-    var bytesToEvict = Math.max(size, ImageCache.EVICTION_CHUNK_SIZE);
+    let bytesToEvict = Math.max(size, ImageCache.EVICTION_CHUNK_SIZE);
 
     // Fetch all metadata.
-    var metadataEntries = [];
-    var metadataStore = transaction.objectStore('metadata');
-    var dataStore = transaction.objectStore('data');
+    const metadataEntries = [];
+    const metadataStore = transaction.objectStore('metadata');
+    const dataStore = transaction.objectStore('data');
 
-    var onEntriesFetched = function() {
+    const onEntriesFetched = function() {
       metadataEntries.sort(function(a, b) {
         return b.lastLoadTimestamp - a.lastLoadTimestamp;
       });
 
-      var totalEvicted = 0;
+      let totalEvicted = 0;
       while (bytesToEvict > 0) {
-        var entry = metadataEntries.pop();
+        const entry = metadataEntries.pop();
         totalEvicted += entry.size;
         bytesToEvict -= entry.size;
         metadataStore.delete(entry.key);  // Remove asynchronously.
@@ -183,7 +183,7 @@
     }.bind(this);
 
     metadataStore.openCursor().onsuccess = function(e) {
-      var cursor = e.target.result;
+      const cursor = e.target.result;
       if (cursor) {
         metadataEntries.push(cursor.value);
         cursor.continue();
@@ -214,8 +214,8 @@
     return;
   }
 
-  var onNotFoundInCache = function() {
-    var metadataEntry = {
+  const onNotFoundInCache = function() {
+    const metadataEntry = {
       key: key,
       timestamp: timestamp,
       width: width,
@@ -225,14 +225,14 @@
       lastLoadTimestamp: Date.now(),
     };
 
-    var dataEntry = {key: key, data: data};
+    const dataEntry = {key: key, data: data};
 
-    var transaction = this.db_.transaction(['settings', 'metadata', 'data'],
-                                           'readwrite');
-    var metadataStore = transaction.objectStore('metadata');
-    var dataStore = transaction.objectStore('data');
+    const transaction =
+        this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
+    const metadataStore = transaction.objectStore('metadata');
+    const dataStore = transaction.objectStore('data');
 
-    var onCacheEvicted = function() {
+    const onCacheEvicted = function() {
       metadataStore.put(metadataEntry);  // Add asynchronously.
       dataStore.put(dataEntry);  // Add asynchronously.
     };
@@ -263,19 +263,19 @@
     return;
   }
 
-  var transaction = this.db_.transaction(['settings', 'metadata', 'data'],
-                                         'readwrite');
-  var metadataStore = transaction.objectStore('metadata');
-  var dataStore = transaction.objectStore('data');
-  var metadataRequest = metadataStore.get(key);
-  var dataRequest = dataStore.get(key);
+  const transaction =
+      this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
+  const metadataStore = transaction.objectStore('metadata');
+  const dataStore = transaction.objectStore('data');
+  const metadataRequest = metadataStore.get(key);
+  const dataRequest = dataStore.get(key);
 
-  var metadataEntry = null;
-  var metadataReceived = false;
-  var dataEntry = null;
-  var dataReceived = false;
+  let metadataEntry = null;
+  let metadataReceived = false;
+  let dataEntry = null;
+  let dataReceived = false;
 
-  var onPartialSuccess = function() {
+  const onPartialSuccess = function() {
     // Check if all sub-requests have finished.
     if (!metadataReceived || !dataReceived) {
       return;
@@ -352,17 +352,17 @@
     return;
   }
 
-  var transaction = opt_transaction ||
+  const transaction = opt_transaction ||
       this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
-  var metadataStore = transaction.objectStore('metadata');
-  var dataStore = transaction.objectStore('data');
+  const metadataStore = transaction.objectStore('metadata');
+  const dataStore = transaction.objectStore('data');
 
-  var cacheSize = null;
-  var cacheSizeReceived = false;
-  var metadataEntry = null;
-  var metadataReceived = false;
+  let cacheSize = null;
+  let cacheSizeReceived = false;
+  let metadataEntry = null;
+  let metadataReceived = false;
 
-  var onPartialSuccess = function() {
+  const onPartialSuccess = function() {
     if (!cacheSizeReceived || !metadataReceived) {
       return;
     }
@@ -385,11 +385,11 @@
     dataStore.delete(key);  // Delete asynchronously.
   }.bind(this);
 
-  var onCacheSizeFailure = function() {
+  const onCacheSizeFailure = function() {
     cacheSizeReceived = true;
   };
 
-  var onCacheSizeSuccess = function(result) {
+  const onCacheSizeSuccess = function(result) {
     cacheSize = result;
     cacheSizeReceived = true;
     onPartialSuccess();
@@ -399,7 +399,7 @@
   this.fetchCacheSize_(onCacheSizeSuccess, onCacheSizeFailure, transaction);
 
   // Receive image's metadata.
-  var metadataRequest = metadataStore.get(key);
+  const metadataRequest = metadataStore.get(key);
 
   metadataRequest.onsuccess = function(e) {
     if (e.target.result) {
diff --git a/ui/file_manager/image_loader/cache_unittest.js b/ui/file_manager/image_loader/cache_unittest.js
index c16f705..4c4d1e8 100644
--- a/ui/file_manager/image_loader/cache_unittest.js
+++ b/ui/file_manager/image_loader/cache_unittest.js
@@ -5,7 +5,7 @@
 'use strict';
 
 function testCreateCacheKey() {
-  let key = LoadImageRequest.cacheKey({url: 'http://example.com/image.jpg'});
+  const key = LoadImageRequest.cacheKey({url: 'http://example.com/image.jpg'});
   assertTrue(!!key);
 }
 
diff --git a/ui/file_manager/image_loader/image_loader.js b/ui/file_manager/image_loader/image_loader.js
index 787c1bc..1540aec 100644
--- a/ui/file_manager/image_loader/image_loader.js
+++ b/ui/file_manager/image_loader/image_loader.js
@@ -38,8 +38,8 @@
                 {volumeId: event.volumeMetadata.volumeId}, function() {});
           }
         });
-    var initPromises = volumeMetadataList.map(function(volumeMetadata) {
-      var requestPromise = new Promise(function(callback) {
+    const initPromises = volumeMetadataList.map(function(volumeMetadata) {
+      const requestPromise = new Promise(function(callback) {
         chrome.fileSystem.requestFileSystem(
             {volumeId: volumeMetadata.volumeId},
             /** @type {function(FileSystem=)} */(callback));
@@ -87,11 +87,11 @@
     return;
   }
 
-  var request = /** @type {!LoadImageRequest} */ (request_data);
+  const request = /** @type {!LoadImageRequest} */ (request_data);
 
   // Sending a response may fail if the receiver already went offline.
   // This is not an error, but a normal and quite common situation.
-  let failSafeSendResponse = function(response) {
+  const failSafeSendResponse = function(response) {
     try {
       sendResponse(response);
     } catch (e) {
@@ -124,14 +124,14 @@
  * @private
  */
 ImageLoader.prototype.onMessage_ = function(senderId, request, callback) {
-  var requestId = senderId + ':' + request.taskId;
+  const requestId = senderId + ':' + request.taskId;
   if (request.cancel) {
     // Cancel a task.
     this.scheduler_.remove(requestId);
     return false;  // No callback calls.
   } else {
     // Create a request task and add it to the scheduler (queue).
-    var requestTask = new ImageRequest(
+    const requestTask = new ImageRequest(
         requestId, this.cache_, this.piexLoader_, request, callback);
     this.scheduler_.add(requestTask);
     return true;  // Request will call the callback.
diff --git a/ui/file_manager/image_loader/image_loader_client.js b/ui/file_manager/image_loader/image_loader_client.js
index 4b8e2bf..7fe1746 100644
--- a/ui/file_manager/image_loader/image_loader_client.js
+++ b/ui/file_manager/image_loader/image_loader_client.js
@@ -189,7 +189,7 @@
  * @return {?number} Remote task id or null if loaded from cache.
  */
 ImageLoaderClient.loadToImage = function(request, image, onSuccess, onError) {
-  var callback = function(result) {
+  const callback = function(result) {
     if (result.status == LoadImageResponseStatus.ERROR) {
       onError();
       return;
diff --git a/ui/file_manager/image_loader/image_loader_client_unittest.js b/ui/file_manager/image_loader/image_loader_client_unittest.js
index 054785f..0c28e48a 100644
--- a/ui/file_manager/image_loader/image_loader_client_unittest.js
+++ b/ui/file_manager/image_loader/image_loader_client_unittest.js
@@ -40,7 +40,7 @@
     }
   };
 
-  let request = LoadImageRequest.createForUrl(url);
+  const request = LoadImageRequest.createForUrl(url);
   request.cache = cache;
 
   return new Promise(function(fulfill) {
@@ -51,7 +51,7 @@
 }
 
 function testCache(callback) {
-  var client = new ImageLoaderClient();
+  const client = new ImageLoaderClient();
   reportPromise(
       loadAndCheckCacheUsed(client, 'http://example.com/image.jpg', true)
           .then(function(cacheUsed) {
@@ -66,7 +66,7 @@
 }
 
 function testNoCache(callback) {
-  var client = new ImageLoaderClient();
+  const client = new ImageLoaderClient();
   reportPromise(
       loadAndCheckCacheUsed(client, 'http://example.com/image.jpg', false)
           .then(function(cacheUsed) {
@@ -81,7 +81,7 @@
 }
 
 function testDataURLCache(callback) {
-  var client = new ImageLoaderClient();
+  const client = new ImageLoaderClient();
   reportPromise(
       loadAndCheckCacheUsed(client, 'data:URI', true)
           .then(function(cacheUsed) {
diff --git a/ui/file_manager/image_loader/image_loader_unittest.js b/ui/file_manager/image_loader/image_loader_unittest.js
index aeadba4..d004d09 100644
--- a/ui/file_manager/image_loader/image_loader_unittest.js
+++ b/ui/file_manager/image_loader/image_loader_unittest.js
@@ -20,15 +20,15 @@
  * - Target: max size is 100x100
  */
 function testNormalImage() {
-  var source = new Image();
+  const source = new Image();
   source.width = 200;
   source.height = 50;
-  var options = {
+  const options = {
     maxWidth: 100,
     maxHeight: 100,
     orientation: ImageOrientation.fromClockwiseRotation(0)
   };
-  var result = calculateCopyParametersFromOptions(source, options);
+  const result = calculateCopyParametersFromOptions(source, options);
   assertEquals(0, result.source.x);
   assertEquals(0, result.source.y);
   assertEquals(200, result.source.width);
@@ -47,15 +47,15 @@
  * - Target: max size is 100x100
  */
 function testRotatedImage() {
-  var source = new Image();
+  const source = new Image();
   source.width = 50;
   source.height = 200;
-  var options = {
+  const options = {
     maxWidth: 100,
     maxHeight: 100,
     orientation: ImageOrientation.fromClockwiseRotation(1)
   };
-  var result = calculateCopyParametersFromOptions(source, options);
+  const result = calculateCopyParametersFromOptions(source, options);
   assertEquals(0, result.source.x);
   assertEquals(0, result.source.y);
   assertEquals(50, result.source.width);
@@ -74,16 +74,16 @@
  * - Target: 50x50 cropped image.
  */
 function testCroppedImage() {
-  var source = new Image();
+  const source = new Image();
   source.width = 800;
   source.height = 100;
-  var options = {
+  const options = {
     width: 50,
     height: 50,
     crop: true,
     orientation: ImageOrientation.fromClockwiseRotation(0)
   };
-  var result = calculateCopyParametersFromOptions(source, options);
+  const result = calculateCopyParametersFromOptions(source, options);
   assertEquals(350, result.source.x);
   assertEquals(0, result.source.y);
   assertEquals(100, result.source.width);
@@ -102,16 +102,16 @@
  * - Target: 50x50 cropped image.
  */
 function testCroppedImageWithResize() {
-  var source = new Image();
+  const source = new Image();
   source.width = 200;
   source.height = 25;
-  var options = {
+  const options = {
     width: 50,
     height: 50,
     crop: true,
     orientation: ImageOrientation.fromClockwiseRotation(0)
   };
-  var result = calculateCopyParametersFromOptions(source, options);
+  const result = calculateCopyParametersFromOptions(source, options);
   assertEquals(87, result.source.x);
   assertEquals(0, result.source.y);
   assertEquals(25, result.source.width);
@@ -130,16 +130,16 @@
  * - Target: 50x50 cropped image.
  */
 function testCroppedTinyImage() {
-  var source = new Image();
+  const source = new Image();
   source.width = 20;
   source.height = 10;
-  var options = {
+  const options = {
     width: 50,
     height: 50,
     crop: true,
     orientation: ImageOrientation.fromClockwiseRotation(0)
   };
-  var result = calculateCopyParametersFromOptions(source, options);
+  const result = calculateCopyParametersFromOptions(source, options);
   assertEquals(5, result.source.x);
   assertEquals(0, result.source.y);
   assertEquals(10, result.source.width);
@@ -158,16 +158,16 @@
  * - Target: 50x50 cropped image
  */
 function testCroppedRotatedImage() {
-  var source = new Image();
+  const source = new Image();
   source.width = 100;
   source.height = 400;
-  var options = {
+  const options = {
     width: 50,
     height: 50,
     crop: true,
     orientation: ImageOrientation.fromClockwiseRotation(1)
   };
-  var result = calculateCopyParametersFromOptions(source, options);
+  const result = calculateCopyParametersFromOptions(source, options);
   assertEquals(0, result.source.x);
   assertEquals(150, result.source.y);
   assertEquals(100, result.source.width);
diff --git a/ui/file_manager/image_loader/image_loader_util.js b/ui/file_manager/image_loader/image_loader_util.js
index ab312d6..b54847b 100644
--- a/ui/file_manager/image_loader/image_loader_util.js
+++ b/ui/file_manager/image_loader/image_loader_util.js
@@ -95,7 +95,7 @@
   target.height = copyParameters.canvas.height;
 
   // Apply.
-  let targetContext =
+  const targetContext =
       /** @type {CanvasRenderingContext2D} */ (target.getContext('2d'));
   targetContext.save();
   request.orientation.cancelImageOrientation(
@@ -208,10 +208,10 @@
   }
   if (colorSpace === ColorSpace.ADOBE_RGB) {
     const matrix = ImageLoaderUtil.MATRIX_FROM_ADOBE_TO_STANDARD;
-    let context =
+    const context =
         assertInstanceof(target.getContext('2d'), CanvasRenderingContext2D);
-    let imageData = context.getImageData(0, 0, target.width, target.height);
-    let data = imageData.data;
+    const imageData = context.getImageData(0, 0, target.width, target.height);
+    const data = imageData.data;
     for (let i = 0; i < data.length; i += 4) {
       // Scale to [0, 1].
       let adobeR = data[i] / 255;
diff --git a/ui/file_manager/image_loader/piex/tests.js b/ui/file_manager/image_loader/piex/tests.js
index 51a66b1..dc61d48f 100644
--- a/ui/file_manager/image_loader/piex/tests.js
+++ b/ui/file_manager/image_loader/piex/tests.js
@@ -47,7 +47,7 @@
     headless: !program.debug
   });
 
-  let page = await browser.newPage();
+  const page = await browser.newPage();
 
   await page.setViewport({
     width: 1200, height: 800
diff --git a/ui/file_manager/image_loader/piex_loader.js b/ui/file_manager/image_loader/piex_loader.js
index 2f98915..49028a34 100644
--- a/ui/file_manager/image_loader/piex_loader.js
+++ b/ui/file_manager/image_loader/piex_loader.js
@@ -16,13 +16,13 @@
  *   image: function(number, number):PiexWasmImageResult
  * }}
  */
-var PiexWasmModule;
+let PiexWasmModule;
 
 /**
  * |window| var Module defined in page <script src='piex/piex.js.wasm'>.
  * @type {PiexWasmModule}
  */
-var Module = window['Module'] || {};
+const PiexModule = window['Module'] || {};
 
 /**
  * Set true only if the wasm Module.onAbort() handler is called.
@@ -35,7 +35,7 @@
  * the Module has failed and re-throws the error.
  * @throws {!Error|string}
  */
-Module.onAbort = (error) => {
+PiexModule.onAbort = (error) => {
   wasmFailed = true;
   throw error;
 };
@@ -49,7 +49,7 @@
  * broken Module state.
  */
 function wasmModuleFailed() {
-  if (wasmFailed || !Module.calledRun) {
+  if (wasmFailed || !PiexModule.calledRun) {
     console.error('[PiexLoader] wasmModuleFailed');
     setTimeout(chrome.runtime.reload, 0);
     return true;
@@ -178,7 +178,7 @@
  *  length:number
  * }}
  */
-var PiexWasmPreviewImageMetadata;
+let PiexWasmPreviewImageMetadata;
 
 /**
  * The piex wasm Module.image(<raw image source>,...) API returns |error|, or
@@ -196,7 +196,7 @@
  *  details:?Object
  * }}
  */
-var PiexWasmImageResult;
+let PiexWasmImageResult;
 
 /**
  * Piex wasm raw image preview image extractor.
@@ -242,13 +242,13 @@
    * @throws {!Error}
    */
   process() {
-    this.memory = Module._malloc(this.length);
+    this.memory = PiexModule._malloc(this.length);
     if (!this.memory) {
       throw new Error('Image malloc failed: ' + this.length + ' bytes');
     }
 
-    Module.HEAP8.set(this.source, this.memory);
-    const result = Module.image(this.memory, this.length);
+    PiexModule.HEAP8.set(this.source, this.memory);
+    const result = PiexModule.image(this.memory, this.length);
     if (result.error) {
       throw new Error(result.error);
     }
@@ -310,7 +310,7 @@
       return null;
     }
 
-    let format = {};
+    const format = {};
     for (const [key, value] of Object.entries(details)) {
       if (typeof value === 'string') {
         format[key] = value.replace(/\0+$/, '').trim();
@@ -330,7 +330,7 @@
    * Release resources.
    */
   close() {
-    Module._free(this.memory);
+    PiexModule._free(this.memory);
   }
 }
 
diff --git a/ui/file_manager/image_loader/request.js b/ui/file_manager/image_loader/request.js
index 5353ad7..bd37d97f 100644
--- a/ui/file_manager/image_loader/request.js
+++ b/ui/file_manager/image_loader/request.js
@@ -273,13 +273,13 @@
   }.bind(this);
 
   // Download data urls directly since they are not supported by XmlHttpRequest.
-  var dataUrlMatches = this.request_.url.match(/^data:([^,;]*)[,;]/);
+  const dataUrlMatches = this.request_.url.match(/^data:([^,;]*)[,;]/);
   if (dataUrlMatches) {
     this.image_.src = this.request_.url;
     this.contentType_ = dataUrlMatches[1];
     return;
   }
-  var drivefsUrlMatches = this.request_.url.match(/^drivefs:(.*)/);
+  const drivefsUrlMatches = this.request_.url.match(/^drivefs:(.*)/);
   if (drivefsUrlMatches) {
     window.webkitResolveLocalFileSystemURL(
         drivefsUrlMatches[1],
@@ -300,21 +300,24 @@
     return;
   }
 
-  var fileType = FileType.getTypeForName(this.request_.url);
+  const fileType = FileType.getTypeForName(this.request_.url);
 
   // Load RAW images by using Piex loader instead of XHR.
   if (fileType.type === 'raw') {
-    this.piexLoader_.load(this.request_.url).then(function(data) {
-      var blob = new Blob([data.thumbnail], {type: 'image/jpeg'});
-      var url = URL.createObjectURL(blob);
-      this.image_.src = url;
-      this.request_.orientation = data.orientation;
-      this.request_.colorSpace = data.colorSpace;
-      this.ifd_ = data.ifd;
-    }.bind(this), function() {
-      // The error has already been logged in PiexLoader.
-      onFailure();
-    });
+    this.piexLoader_.load(this.request_.url)
+        .then(
+            function(data) {
+              const blob = new Blob([data.thumbnail], {type: 'image/jpeg'});
+              const url = URL.createObjectURL(blob);
+              this.image_.src = url;
+              this.request_.orientation = data.orientation;
+              this.request_.colorSpace = data.colorSpace;
+              this.ifd_ = data.ifd;
+            }.bind(this),
+            function() {
+              // The error has already been logged in PiexLoader.
+              onFailure();
+            });
     return;
   }
 
@@ -330,7 +333,7 @@
   }
 
   // Fetch the image via XHR and parse it.
-  var parseImage = function(contentType, blob) {
+  const parseImage = function(contentType, blob) {
     if (contentType) {
       this.contentType_ = contentType;
     }
@@ -396,8 +399,8 @@
   this.aborted_ = false;
 
   // Do not call any callbacks when aborting.
-  var onMaybeSuccess = /** @type {function(string, Blob)} */ (
-      function(contentType, response) {
+  const onMaybeSuccess =
+      /** @type {function(string, Blob)} */ (function(contentType, response) {
         // When content type is not available, try to estimate it from url.
         if (!contentType) {
           contentType =
@@ -409,7 +412,7 @@
         }
       }.bind(this));
 
-  var onMaybeFailure = /** @type {function(number=)} */ (function(opt_code) {
+  const onMaybeFailure = /** @type {function(number=)} */ (function(opt_code) {
     if (!this.aborted_) {
       onFailure();
     }
@@ -417,7 +420,7 @@
 
   // The query parameter is workaround for crbug.com/379678, which forces the
   // browser to obtain the latest contents of the image.
-  var noCacheUrl = url + '?nocache=' + Date.now();
+  const noCacheUrl = url + '?nocache=' + Date.now();
   this.xhr_ = ImageRequest.load_(noCacheUrl, onMaybeSuccess, onMaybeFailure);
 };
 
@@ -427,7 +430,7 @@
  * @return {string} Extracted extension, e.g. png.
  */
 ImageRequest.prototype.extractExtension_ = function(url) {
-  var result = (/\.([a-zA-Z]+)$/i).exec(url);
+  const result = (/\.([a-zA-Z]+)$/i).exec(url);
   return result ? result[1] : '';
 };
 
@@ -443,7 +446,7 @@
  * @private
  */
 ImageRequest.load_ = function(url, onSuccess, onFailure) {
-  let xhr = new XMLHttpRequest();
+  const xhr = new XMLHttpRequest();
   xhr.responseType = 'blob';
 
   xhr.onreadystatechange = function() {
@@ -454,8 +457,8 @@
       onFailure(xhr.status);
       return;
     }
-    let response = /** @type {Blob} */ (xhr.response);
-    let contentType = xhr.getResponseHeader('Content-Type') || response.type;
+    const response = /** @type {Blob} */ (xhr.response);
+    const contentType = xhr.getResponseHeader('Content-Type') || response.type;
     onSuccess(contentType, response);
   }.bind(this);
 
diff --git a/ui/file_manager/image_loader/scheduler.js b/ui/file_manager/image_loader/scheduler.js
index aba5115..823eb4c 100644
--- a/ui/file_manager/image_loader/scheduler.js
+++ b/ui/file_manager/image_loader/scheduler.js
@@ -82,17 +82,17 @@
  * @param {string} requestId Unique ID of the request.
  */
 Scheduler.prototype.remove = function(requestId) {
-  var request = this.requests_[requestId];
+  const request = this.requests_[requestId];
   if (!request) {
     return;
   }
 
   // Remove from the internal queues with pending tasks.
-  var newIndex = this.pendingRequests_.indexOf(request);
+  const newIndex = this.pendingRequests_.indexOf(request);
   if (newIndex != -1) {
     this.newRequests_.splice(newIndex, 1);
   }
-  var pendingIndex = this.pendingRequests_.indexOf(request);
+  const pendingIndex = this.pendingRequests_.indexOf(request);
   if (pendingIndex != -1) {
     this.pendingRequests_.splice(pendingIndex, 1);
   }
@@ -137,7 +137,7 @@
   // Run only up to MAXIMUM_IN_PARALLEL in the same time.
   while (this.pendingRequests_.length &&
          this.activeRequests_.length < Scheduler.MAXIMUM_IN_PARALLEL) {
-    var request = this.pendingRequests_.shift();
+    const request = this.pendingRequests_.shift();
     this.activeRequests_.push(request);
 
     // Try to load from cache. If doesn't exist, then download.
@@ -157,7 +157,7 @@
  * @private
  */
 Scheduler.prototype.finish_ = function(request) {
-  var index = this.activeRequests_.indexOf(request);
+  const index = this.activeRequests_.indexOf(request);
   if (index < 0) {
     console.warn('Request not found.');
   }
diff --git a/ui/file_manager/integration_tests/file_manager/quick_view.js b/ui/file_manager/integration_tests/file_manager/quick_view.js
index 8f77e41..851bb1df 100644
--- a/ui/file_manager/integration_tests/file_manager/quick_view.js
+++ b/ui/file_manager/integration_tests/file_manager/quick_view.js
@@ -1259,4 +1259,48 @@
       return true;
     });
   };
+
+  /**
+   * Tests checking the tabbing on jpeg files in Quick View.
+   */
+  testcase.openQuickViewTabIndexImage = async () => {
+    const caller = getCaller();
+
+    /**
+     * The <webview> resides in the <files-safe-media type="image"> shadow DOM,
+     * which is a child of the #quick-view shadow DOM.
+     */
+    const webView =
+        ['#quick-view', 'files-safe-media[type="image"]', 'webview'];
+
+    // Open Files app on Downloads containing ENTRIES.smallJpeg.
+    const appId = await setupAndWaitUntilReady(
+        RootPath.DOWNLOADS, [ENTRIES.smallJpeg], []);
+
+    // Open the file in Quick View.
+    await openQuickView(appId, ENTRIES.smallJpeg.nameText);
+
+    // Prepare a list of tab-index queries.
+    const tabQueries = [
+      {'query': ['#quick-view', '[aria-label="Back"]:focus']},
+      {'query': ['#quick-view', '[aria-label="Open"]:focus']},
+      {'query': ['#quick-view', '[aria-label="File info"]:focus']},
+      {'query': ['#quick-view', '[aria-label="Back"]:focus']},
+    ];
+
+    // Hit tab key to focus on the element.
+    for (const query of tabQueries) {
+      const result = await sendTestMessage(
+          {name: 'dispatchTabKey', shift: query.shift || false});
+      chrome.test.assertEq(
+          result, 'tabKeyDispatched', 'Tab key dispatch failure');
+
+      // Wait until we get the focus on the element
+      await remoteCall.waitForElement(appId, query.query);
+
+      // Make sure the events are handled correctly.
+      chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
+          'requestAnimationFrame', appId, []));
+    }
+  };
 })();
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 6b7293c..faf9f52 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -286,6 +286,7 @@
     ":gfx_switches",
     ":memory_buffer_sources",
     ":native_widget_types",
+    ":resize_image_dimensions",
     ":selection_bound_sources",
     "//base",
     "//skia",
@@ -298,7 +299,6 @@
   ]
   deps = [
     ":gfx_export",
-    ":resize_image_dimensions",
     "//base",
     "//base:base_static",
     "//base:i18n",
diff --git a/ui/gfx/image/image_util.cc b/ui/gfx/image/image_util.cc
index 80bca3ea..d21fb445 100644
--- a/ui/gfx/image/image_util.cc
+++ b/ui/gfx/image/image_util.cc
@@ -85,10 +85,9 @@
   if (bitmap.height() * bitmap.width() > kSearchByImageMaxImageArea &&
       (bitmap.width() > kSearchByImageMaxImageWidth ||
        bitmap.height() > kSearchByImageMaxImageHeight)) {
-    SkBitmap new_bitmap;
-    new_bitmap = skia::ImageOperations::Resize(
-        new_bitmap, skia::ImageOperations::RESIZE_GOOD,
-        kSearchByImageMaxImageWidth, kSearchByImageMaxImageHeight);
+    SkBitmap new_bitmap = skia::ImageOperations::Resize(
+        bitmap, skia::ImageOperations::RESIZE_GOOD, kSearchByImageMaxImageWidth,
+        kSearchByImageMaxImageHeight);
     return Image(ImageSkia(ImageSkiaRep(new_bitmap, 0.0f)));
   }
 
diff --git a/ui/gfx/image/image_util_unittest.cc b/ui/gfx/image/image_util_unittest.cc
index 1f702b94..40efde2 100644
--- a/ui/gfx/image/image_util_unittest.cc
+++ b/ui/gfx/image/image_util_unittest.cc
@@ -12,6 +12,7 @@
 #include "third_party/skia/include/core/SkRect.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/image/image_unittest_util.h"
+#include "ui/gfx/image/resize_image_dimensions.h"
 
 TEST(ImageUtilTest, JPEGEncodeAndDecode) {
   gfx::Image original = gfx::test::CreateImage(100, 100);
@@ -133,3 +134,15 @@
     EXPECT_EQ(8, right);
   }
 }
+
+TEST(ImageUtilTest, ResizedImageForSearchByImage) {
+  // Make sure the image large enough to let ResizedImageForSearchByImage to
+  // resize the image.
+  gfx::Image original_image =
+      gfx::test::CreateImage(gfx::kSearchByImageMaxImageHeight + 10,
+                             gfx::kSearchByImageMaxImageWidth + 10);
+
+  gfx::Image resized_image = gfx::ResizedImageForSearchByImage(original_image);
+  EXPECT_NE(original_image.Size(), resized_image.Size());
+  EXPECT_FALSE(resized_image.IsEmpty());
+}
diff --git a/ui/strings/translations/ui_strings_es-419.xtb b/ui/strings/translations/ui_strings_es-419.xtb
index 9e11266..3907dcac 100644
--- a/ui/strings/translations/ui_strings_es-419.xtb
+++ b/ui/strings/translations/ui_strings_es-419.xtb
@@ -152,7 +152,7 @@
 <translation id="6022924867608035986">Borrar el texto en el cuadro de búsqueda</translation>
 <translation id="6040143037577758943">Cerrar</translation>
 <translation id="6119846243427417423">activar</translation>
-<translation id="6129953537138746214">Google Space</translation>
+<translation id="6129953537138746214">Espacio</translation>
 <translation id="6135826906199951471">Supr</translation>
 <translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
 <translation id="6156262341071374681">Expande la lista a todas las apps</translation>